From b8a837e1264838191a0758692b61a1e5776e3b4c Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 28 Aug 2019 11:16:01 +0800 Subject: [PATCH] 1 --- server/gameserver/human.cc | 52 +++++++++++++++++++++++-- server/gameserver/human.h | 4 +- server/gameserver/loot.h | 1 + server/gameserver/player.cc | 16 +------- server/gameserver/room.cc | 7 +++- server/gameserver/room.h | 2 +- server/gameserver/types.h | 1 + server/tools/protobuild/metatable.proto | 1 + 8 files changed, 61 insertions(+), 23 deletions(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index fcc17a9..db82746 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -113,10 +113,14 @@ void Human::FillMFObjectFull(cs::MFObjectFull* full_data) p->set_disconnected(disconnected); p->set_anim_type(anim_type); p->set_anim_seq(anim_seq); - if (skin_jlf.skin_id != 0) { - skin_jlf.ToPB(p->mutable_skin()); + if (skin_tank.skin_id != 0) { + skin_tank.ToPB(p->mutable_skin()); } else { - skin.ToPB(p->mutable_skin()); + if (skin_jlf.skin_id != 0) { + skin_jlf.ToPB(p->mutable_skin()); + } else { + skin.ToPB(p->mutable_skin()); + } } p->set_backpack(backpack); p->set_helmet(helmet); @@ -318,7 +322,11 @@ void Human::RecalcSelfCollider() AddCollider(self_collider_); } self_collider_->pos = a8::Vec2(); - self_collider_->rad = meta->i->radius(); + if (skin_tank_meta) { + self_collider_->rad = skin_tank_meta->i->rad(); + } else { + self_collider_->rad = meta->i->radius(); + } } bool Human::IsCollision() @@ -2242,3 +2250,39 @@ void Human::SendBattleReport() ); delete params; } + +void Human::ProcLootSkin(Loot* entity, MetaData::Equip* item_meta) +{ + if (item_meta->i->is_luck()) { + if (item_meta->i->is_luck() == 2) { + if (skin_tank.skin_id != 0) { + int entity_uniid = room->CreateLoot(skin_tank.skin_id, pos, 1, 1); + Entity* loot_entity = room->GetEntityByUniId(entity_uniid); + if (loot_entity && loot_entity->entity_type == ET_Loot) { + ((Loot*)loot_entity)->bullet_num = skin_tank.bullet_num; + } + } + skin_tank.skin_id = item_meta->i->id(); + skin_tank.skin_lv = std::max(1, GetSkinConfigLv(skin_tank.skin_id)); + skin_tank.bullet_num = entity->bullet_num; + skin_tank_meta = item_meta; + RecalcSelfCollider(); + RecalcBuff(); + SyncAroundPlayers(); + } else { + if (skin_jlf.skin_id != 0) { + room->DropItem(pos, skin_jlf.skin_id, 1, skin_jlf.skin_lv); + } + skin_jlf.skin_id = item_meta->i->id(); + skin_jlf.skin_lv = std::max(1, GetSkinConfigLv(skin_jlf.skin_id)); + skin_jlf_meta = MetaMgr::Instance()->GetDress(skin_jlf.skin_id); + if (skin_jlf_meta) { + skill_meta = MetaMgr::Instance()->GetSkill(skin_jlf_meta->i->skill_id()); + } else { + skill_meta = nullptr; + } + RecalcBuff(); + SyncAroundPlayers(); + } + } +} diff --git a/server/gameserver/human.h b/server/gameserver/human.h index f3ff912..5d670fc 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -32,6 +32,7 @@ struct xtimer_list; class CircleCollider; class AabbCollider; class Obstacle; +class Loot; class Human : public Entity { public: @@ -50,7 +51,7 @@ class Human : public Entity MetaData::Dress* skin_meta = nullptr; MetaData::Skill* skill_meta = nullptr; MetaData::Dress* skin_jlf_meta = nullptr; - MetaData::Dress* skin_tank_meta = nullptr; + MetaData::Equip* skin_tank_meta = nullptr; HumanAbility buff; a8::Vec2 move_dir; @@ -207,6 +208,7 @@ class Human : public Entity protected: void _UpdateMove(int speed); + void ProcLootSkin(Loot* entity, MetaData::Equip* item_meta); private: void ClearFrameData(); diff --git a/server/gameserver/loot.h b/server/gameserver/loot.h index 5190660..ffe7754 100644 --- a/server/gameserver/loot.h +++ b/server/gameserver/loot.h @@ -18,6 +18,7 @@ class Loot : public Entity int count = 0; int item_level = 0; bool pickuped = false; + int bullet_num = 0; Loot(); virtual ~Loot() override; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index f2f0ea1..9928a28 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -536,21 +536,7 @@ void Player::LootInteraction(Loot* entity) break; case 8: { - if (item_meta->i->is_luck()) { - if (skin_jlf.skin_id != 0) { - room->DropItem(pos, skin_jlf.skin_id, 1, skin_jlf.skin_lv); - } - skin_jlf.skin_id = entity->item_id; - skin_jlf.skin_lv = std::max(1, GetSkinConfigLv(skin_jlf.skin_id)); - skin_jlf_meta = MetaMgr::Instance()->GetDress(skin_jlf.skin_id); - if (skin_jlf_meta) { - skill_meta = MetaMgr::Instance()->GetSkill(skin_jlf_meta->i->skill_id()); - } else { - skill_meta = nullptr; - } - RecalcBuff(); - SyncAroundPlayers(); - } + ProcLootSkin(entity, item_meta); } break; default: diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index f5f9cfd..d53243f 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -476,13 +476,13 @@ Hero* Room::CreateHero(Human* hum) return hero; } -void Room::CreateLoot(int equip_id, a8::Vec2 pos, int count, int equip_lv) +int Room::CreateLoot(int equip_id, a8::Vec2 pos, int count, int equip_lv) { MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(equip_id); if (equip_meta) { if (equip_meta->i->equip_type() == 2 && MetaMgr::Instance()->fighting_mode) { - return; + return 0; } Loot* entity = new Loot(); entity->room = this; @@ -512,6 +512,9 @@ void Room::CreateLoot(int equip_id, a8::Vec2 pos, int count, int equip_lv) uniid_hash_[entity->entity_uniid] = entity; grid_service.AddEntity(entity); entity->BroadcastFullState(); + return entity->entity_uniid; + } else { + return 0; } } diff --git a/server/gameserver/room.h b/server/gameserver/room.h index a56af97..dfdf096 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -76,7 +76,7 @@ public: void DropItem(a8::Vec2 pos, int item_id, int item_count, int item_lv); Hero* CreateHero(Human* hum); - void CreateLoot(int equip_id, a8::Vec2 pos, int count, int equip_lv); + int CreateLoot(int equip_id, a8::Vec2 pos, int count, int equip_lv); void CreateBullet(Human* hum, Weapon* weapon, a8::Vec2 pos, a8::Vec2 dir, float fly_distance); diff --git a/server/gameserver/types.h b/server/gameserver/types.h index 5e085f1..795bb7d 100755 --- a/server/gameserver/types.h +++ b/server/gameserver/types.h @@ -63,6 +63,7 @@ struct Skin { int skin_id = 0; int skin_lv = 0; + int bullet_num = 0; void ToPB(cs::MFSkin* pb_obj); }; diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index bf8bd50..7dcfd4f 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -77,6 +77,7 @@ message Equip optional string bullet_born_offset = 30; //子弹出生偏移 optional float bullet_angle = 34; //子弹浮动方向 optional string name = 35; //装备名字 + optional float rad = 36; //半径 optional string inventory_slot = 31; //库存槽位 optional int32 _inventory_slot = 32; //库存槽位