添加武器等级

This commit is contained in:
aozhiwei 2019-05-21 14:47:21 +08:00
parent db3dcb8dfa
commit 530a0ce572
7 changed files with 38 additions and 24 deletions

View File

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

View File

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

View File

@ -135,10 +135,17 @@ namespace MetaData
}
}
assert(itemids.size() == nums.size());
#if 1
std::vector<int> 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<std::tuple<int, int>>& drop_items)
void Drop::RandItems(std::vector<std::tuple<int, int, int>>& 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;

View File

@ -84,10 +84,10 @@ namespace MetaData
const metatable::Drop* i = nullptr;
void Init();
void RandItems(std::vector<std::tuple<int, int>>& drop_items);
void RandItems(std::vector<std::tuple<int, int, int>>& drop_items);
private:
std::vector<std::tuple<std::vector<int>, std::vector<int>, int>> items;
std::vector<std::tuple<std::vector<int>, std::vector<int>, std::vector<int>, int>> items;
int total_weight = 0;
};

View File

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

View File

@ -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<std::tuple<int, int>> drop_items;
std::vector<std::tuple<int, int, int>> 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);

View File

@ -74,10 +74,10 @@ public:
std::function<bool (Entity*, a8::XParams&)> 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);