diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 14a5033..cd2fcf3 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3864,3 +3864,28 @@ void Human::ProcUseItem(int item_id) DecItem(item_id, 1); } } + +Weapon* Human::TakeWeapon(MetaData::Equip* equip_meta) +{ + Weapon* weapon = nullptr; + if (equip_meta->i->equip_type() == EQUIP_TYPE_WEAPON) { + if (equip_meta->i->equip_subtype() == 1) { + } else { + for (int i = GUN_SLOT1; i <= GUN_SLOT2; ++i) { + if (weapons[i].weapon_id == 0) { + weapon = &weapons[i]; + weapon->weapon_idx = i; + } else if (weapons[i].meta->i->equip_subtype() == + equip_meta->i->equip_subtype()){ + if (equip_meta->i->quality() > weapons[i].meta->i->quality()) { + weapon = &weapons[i]; + weapon->weapon_idx = i; + } else { + weapon = nullptr; + } + } + } + } + } + return weapon; +} diff --git a/server/gameserver/human.h b/server/gameserver/human.h index ecbf752..ac42234 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -275,6 +275,7 @@ private: virtual void OnBuffRemove(Buff& buff) override; virtual void DoSkillPreProc(int skill_id, int target_id, const a8::Vec2& target_pos) override; virtual void DoSkillPostProc(bool used, int skill_id, int target_id, const a8::Vec2& target_pos) override; + Weapon* TakeWeapon(MetaData::Equip* equip_meta); protected: int level_ = 0; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index efb3531..03b7f9e 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -546,8 +546,13 @@ void Player::LootInteraction(Loot* entity) need_sync_active_player = true; SyncAroundPlayers(__FILE__, __LINE__, __func__); } else { + if (FreezeOperate()) { + return; + } Weapon* weapon = nullptr; bool switch_gun = false; + #if 0 + #else if (weapons[GUN_SLOT1].weapon_id == 0) { weapon = &weapons[GUN_SLOT1]; weapon->weapon_idx = GUN_SLOT1; @@ -561,6 +566,7 @@ void Player::LootInteraction(Loot* entity) switch_gun = true; } } + #endif if (!weapon) { /* cs::SMPickup notifymsg; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 6b47ac1..d72bfdb 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -1755,6 +1755,7 @@ void Room::AirDrop(int appear_time, int box_id, int airdrop_id) param.param2.GetDouble(), param.param3.GetDouble() ); + obstacle->PushCollisionObjects(); obstacle->is_treasure_box = true; if (room->GetRoomMode() == kZombieMode) { obstacle->is_terminator_airdrop_box = diff --git a/server/gameserver/roomobstacle.cc b/server/gameserver/roomobstacle.cc index f266959..f938d16 100644 --- a/server/gameserver/roomobstacle.cc +++ b/server/gameserver/roomobstacle.cc @@ -488,7 +488,9 @@ void RoomObstacle::SummonAirDropBox(int box_id) GetPos().x, GetPos().y ); - + if (obstacle) { + obstacle->PushCollisionObjects(); + } } Entity* RoomObstacle::GetRealObject(Room* room) @@ -606,3 +608,19 @@ void RoomObstacle::Destory() #endif DetachFromMaster(); } + +void RoomObstacle::PushCollisionObjects() +{ + std::set grid_list; + room->grid_service->GetAllCellsByXy(room, GetPos().x, GetPos().y, grid_list); + room->grid_service->TraverseCreatures + ( + room->GetRoomIdx(), + grid_list, + [this] (Creature* c, bool& stop) + { + if (TestCollision(room, c)) { + c->MustBeAddBuff(c, 8003); + } + }); +} diff --git a/server/gameserver/roomobstacle.h b/server/gameserver/roomobstacle.h index 20863ad..1b5e7e4 100644 --- a/server/gameserver/roomobstacle.h +++ b/server/gameserver/roomobstacle.h @@ -34,6 +34,7 @@ class RoomObstacle : public Obstacle RoomObstacleWeakPtr AllocWeakPtr(); RoomObstacleWeakPtr& GetWeakPtrRef(); void Destory(); + void PushCollisionObjects(); private: void SpecExplosion();