diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 10be36d..7df8666 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -276,30 +276,6 @@ void Human::UpdatePoisoning() } } -void Human::DropItem(int item_id) -{ - MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(item_id); - if (equip_meta) { - Loot* entity = new Loot(); - entity->room = room; - entity->meta = equip_meta; - entity->entity_uniid = room->AllocUniid(); - { - Vector2D dir = Vector2D::UP; - dir.Rotate(a8::RandAngle()); - entity->pos = pos + dir * (25 + rand() % 50); - } - entity->item_id = equip_meta->i->id(); - entity->count = 1; - entity->Initialize(); - room->uniid_hash_[entity->entity_uniid] = entity; - for (auto& pair : room->human_hash_) { - pair.second->new_objects.insert(entity); - pair.second->part_objects.insert(entity); - } - } -} - void Human::SyncAroundPlayers() { for (auto& pair : room->human_hash_) { diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 3bbb177..1785758 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -103,7 +103,6 @@ class Human : public Entity void FindPath(); float GetRadius(); void UpdatePoisoning(); - void DropItem(int item_id); void SyncAroundPlayers(); void AutoLoadingBullet(bool manual = false); void StartAction(ActionType_e action_type, diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index df87734..0468d44 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -512,7 +512,7 @@ void Player::LootInteraction(Loot* entity) if (old_item_meta->i->equip_lv() >= item_meta->i->equip_lv()) { return; } - DropItem(old_item_meta->i->id()); + room->DropItem(pos, old_item_meta->i->id()); } backpack = item_meta->i->id(); } @@ -527,7 +527,7 @@ void Player::LootInteraction(Loot* entity) if (old_item_meta->i->equip_lv() >= item_meta->i->equip_lv()) { return; } - DropItem(old_item_meta->i->id()); + room->DropItem(pos, old_item_meta->i->id()); } chest = item_meta->i->id(); } else if (item_meta->i->equip_subtype() == 2) { @@ -537,7 +537,7 @@ void Player::LootInteraction(Loot* entity) if (old_item_meta->i->equip_lv() >= item_meta->i->equip_lv()) { return; } - DropItem(old_item_meta->i->id()); + room->DropItem(pos, old_item_meta->i->id()); } helmet = item_meta->i->id(); } diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 9c2bef3..1f4d988 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -395,6 +395,30 @@ void Room::FillSMMapInfo(cs::SMMapInfo& map_info) } } +void Room::DropItem(Vector2D pos, int item_id) +{ + MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(item_id); + if (equip_meta) { + Loot* entity = new Loot(); + entity->room = this; + entity->meta = equip_meta; + entity->entity_uniid = AllocUniid(); + { + Vector2D dir = Vector2D::UP; + dir.Rotate(a8::RandAngle()); + entity->pos = pos + dir * (25 + rand() % 50); + } + entity->item_id = equip_meta->i->id(); + entity->count = 1; + entity->Initialize(); + uniid_hash_[entity->entity_uniid] = entity; + for (auto& pair : human_hash_) { + pair.second->new_objects.insert(entity); + pair.second->part_objects.insert(entity); + } + } +} + void Room::ClearDeletedObjects() { for (auto& obj_uniid : frame_data.deleted_objects) { diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 5e20643..7f1b060 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -61,6 +61,7 @@ public: void ProcDrop(Vector2D center, int drop_id); void CreateThings(); void FillSMMapInfo(cs::SMMapInfo& map_info); + void DropItem(Vector2D pos, int item_id); private: void ClearDeletedObjects();