diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 66049cf..f611280 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -1859,7 +1859,7 @@ void Human::DeadDrop() for (auto& weapon : weapons) { if (weapon.weapon_id != 0 && weapon.weapon_id != default_weapon.weapon_id) { Vector2D drop_pos = pos; - room->DropItem(drop_pos, weapon.weapon_id, 1); + room->DropItem(drop_pos, weapon.weapon_id, 1, weapon.weapon_lv); } } for (size_t slot = 0; slot < inventory_.size(); ++slot) { @@ -1871,7 +1871,7 @@ void Human::DeadDrop() return; } Vector2D drop_pos = pos; - room->DropItem(drop_pos, equip_meta->i->id(), inventory_[slot]); + room->DropItem(drop_pos, equip_meta->i->id(), inventory_[slot], 1); } } } diff --git a/server/gameserver/loot.h b/server/gameserver/loot.h index 66e8a93..5190660 100644 --- a/server/gameserver/loot.h +++ b/server/gameserver/loot.h @@ -16,6 +16,7 @@ class Loot : public Entity MetaData::Equip* meta = nullptr; int item_id = 0; int count = 0; + int item_level = 0; bool pickuped = false; Loot(); diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index e99e8d2..09bc47e 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -135,10 +135,17 @@ namespace MetaData } } assert(itemids.size() == nums.size()); + #if 1 + std::vector item_lvs; + for (auto& itr : itemids) { + item_lvs.push_back(1); + } + #endif if (this->i->type() == 1) { auto item_tuple = std::make_tuple( itemids, nums, + item_lvs, a8::XValue(weight_list[i]).GetInt() ); items.push_back(item_tuple); @@ -146,6 +153,7 @@ namespace MetaData auto item_tuple = std::make_tuple( itemids, nums, + item_lvs, total_weight ); items.push_back(item_tuple); @@ -154,15 +162,16 @@ namespace MetaData assert(i->type() == 1 || i->type() == 2); } - void Drop::RandItems(std::vector>& drop_items) + void Drop::RandItems(std::vector>& drop_items) { if (i->type() == 1) { for (auto& item : items) { - if ((rand() % 10000) <= std::get<2>(item)) { + if ((rand() % 10000) <= std::get<3>(item)) { for (size_t i = 0; i < std::get<0>(item).size(); ++i) { drop_items.push_back(std::make_tuple( std::get<0>(item)[i], - std::get<1>(item)[i] + std::get<1>(item)[i], + std::get<2>(item)[i] )); } } @@ -170,11 +179,12 @@ namespace MetaData } else if (total_weight > 0) { int rnd = rand() % total_weight; for (auto& item : items) { - if (std::get<2>(item) >= rnd) { + if (std::get<3>(item) >= rnd) { for (size_t i = 0; i < std::get<0>(item).size(); ++i) { drop_items.push_back(std::make_tuple( std::get<0>(item)[i], - std::get<1>(item)[i] + std::get<1>(item)[i], + std::get<2>(item)[i] )); } break; diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index afb18d9..1430bbf 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -84,10 +84,10 @@ namespace MetaData const metatable::Drop* i = nullptr; void Init(); - void RandItems(std::vector>& drop_items); + void RandItems(std::vector>& drop_items); private: - std::vector, std::vector, int>> items; + std::vector, std::vector, std::vector, int>> items; int total_weight = 0; }; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 7b7f7a7..baabccf 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -498,7 +498,7 @@ void Player::LootInteraction(Loot* entity) } else { weapons[0].weapon_idx = 0; weapons[0].weapon_id = entity->item_id; - weapons[0].weapon_lv = 1; + weapons[0].weapon_lv = entity->item_level; weapons[0].ammo = 0; } need_sync_active_player = true; @@ -527,7 +527,7 @@ void Player::LootInteraction(Loot* entity) return; } weapon->weapon_id = entity->item_id; - weapon->weapon_lv = 1; + weapon->weapon_lv = entity->item_level; weapon->ammo = 0; weapon->meta = item_meta; AutoLoadingBullet(); @@ -539,7 +539,7 @@ void Player::LootInteraction(Loot* entity) case 8: { if (skin != 0) { - room->DropItem(pos, skin, 1); + room->DropItem(pos, skin, 1, 1); } skin = entity->item_id; skin_meta = MetaMgr::Instance()->GetDress(skin); @@ -601,7 +601,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(), 1); + room->DropItem(pos, old_item_meta->i->id(), 1, 1); } backpack = item_meta->i->id(); RecalcVolume(); @@ -617,7 +617,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(), 1); + room->DropItem(pos, old_item_meta->i->id(), 1, 1); } chest = item_meta->i->id(); RecalcAttr(); @@ -628,7 +628,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(), 1); + room->DropItem(pos, old_item_meta->i->id(), 1, 1); } helmet = item_meta->i->id(); RecalcAttr(); @@ -765,6 +765,7 @@ void Player::UpdateDropWeapon() bool drop_ok = false; Weapon* weapon = &weapons[drop_weapon_idx]; int weapon_id = weapon->weapon_id; + int weapon_lv = weapon->weapon_lv; int weapon_ammo = weapon->ammo; MetaData::Equip* weapon_meta = weapon->meta; if (weapon->weapon_id != 0) { @@ -829,7 +830,7 @@ void Player::UpdateDropWeapon() ) { Vector2D dir = Vector2D::UP; dir.Rotate(a8::RandAngle()); - room->CreateLoot(weapon_id, pos + dir * (25 + rand() % 50), 1); + room->CreateLoot(weapon_id, pos + dir * (25 + rand() % 50), 1, weapon_lv); } if (weapon_ammo > 0) { MetaData::Equip* bullet_meta = MetaMgr::Instance()->GetEquip(weapon_meta->i->use_bullet()); @@ -845,7 +846,7 @@ void Player::UpdateDropWeapon() Vector2D drop_dir = Vector2D::UP; drop_dir.Rotate(a8::RandAngle()); Vector2D drop_pos = pos + drop_dir * (25 + rand() % 50); - room->DropItem(drop_pos, bullet_meta->i->id(), drop_num); + room->DropItem(drop_pos, bullet_meta->i->id(), drop_num, 1); } } } diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index deddb77..3f6c3c8 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -291,12 +291,12 @@ void Room::ScatterDrop(Vector2D center, int drop_id) { MetaData::Drop* drop_meta = MetaMgr::Instance()->GetDrop(drop_id); if (drop_meta) { - std::vector> drop_items; + std::vector> drop_items; drop_meta->RandItems(drop_items); for (auto& item : drop_items) { Vector2D dir = Vector2D::UP; dir.Rotate(a8::RandAngle()); - DropItem(center + dir * (5 + rand() % 50), std::get<0>(item), std::get<1>(item)); + DropItem(center + dir * (5 + rand() % 50), std::get<0>(item), std::get<1>(item), std::get<1>(item)); } } } @@ -354,7 +354,7 @@ void Room::FillSMMapInfo(cs::SMMapInfo& map_info) } } -void Room::DropItem(Vector2D pos, int item_id, int item_count) +void Room::DropItem(Vector2D pos, int item_id, int item_count, int item_lv) { MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(item_id); if (equip_meta && equip_meta->i->group_num() > 0 && item_count > 0) { @@ -366,7 +366,7 @@ void Room::DropItem(Vector2D pos, int item_id, int item_count) dir.Rotate(a8::RandAngle()); pos = pos + dir * (25 + rand() % 50); } - CreateLoot(item_id, pos, drop_num); + CreateLoot(item_id, pos, drop_num, item_lv); total_count -= drop_num; } } @@ -431,6 +431,7 @@ void Room::CreateBuilding(int thing_id, float building_x, float building_y) building->pos.x + obj.x() - building_meta->i->tilewidth() / 2.0, building->pos.y + obj.y() - building_meta->i->tileheight() / 2.0 ), + 1, 1 ); } @@ -481,7 +482,7 @@ Hero* Room::CreateHero(Human* hum) return hero; } -void Room::CreateLoot(int equip_id, Vector2D pos, int count) +void Room::CreateLoot(int equip_id, Vector2D pos, int count, int equip_lv) { MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(equip_id); if (equip_meta) { @@ -496,6 +497,7 @@ void Room::CreateLoot(int equip_id, Vector2D pos, int count) entity->pos = pos; entity->item_id = equip_id; entity->count = count; + entity->item_level = equip_lv; entity->Initialize(); uniid_hash_[entity->entity_uniid] = entity; grid_service.AddEntity(entity); diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 1ed409b..d3f5de9 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -74,10 +74,10 @@ public: std::function func); void ScatterDrop(Vector2D center, int drop_id); - void DropItem(Vector2D pos, int item_id, int item_count); + void DropItem(Vector2D pos, int item_id, int item_count, int item_lv); Hero* CreateHero(Human* hum); - void CreateLoot(int equip_id, Vector2D pos, int count); + void CreateLoot(int equip_id, Vector2D pos, int count, int equip_lv); void CreateBullet(Human* hum, MetaData::Equip* gun_meta, Vector2D pos, Vector2D dir, float fly_distance);