添加武器等级
This commit is contained in:
parent
db3dcb8dfa
commit
530a0ce572
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user