diff --git a/server/gameserver/hero.cc b/server/gameserver/hero.cc index 93628f6b..e3226957 100644 --- a/server/gameserver/hero.cc +++ b/server/gameserver/hero.cc @@ -399,6 +399,15 @@ void Hero::BeKill(int killer_id, const std::string& killer_name, int weapon_id) [room = room, items] (int event, const a8::Args* args) { if (a8::TIMER_EXEC_EVENT == event) { + for (int obj_uniid : items) { + Entity* e = room->GetEntityByUniId(obj_uniid); + if (e && e->IsLoot()) { + Loot* l = e->AsLoot(); + if (!l->pickuped && !l->removing) { + room->RemoveObjectLater(l); + } + } + } } }, &room->xtimer_attacher_); diff --git a/server/gameserver/hero_agent.cc b/server/gameserver/hero_agent.cc index 306dc18c..4bba3c59 100644 --- a/server/gameserver/hero_agent.cc +++ b/server/gameserver/hero_agent.cc @@ -1405,7 +1405,7 @@ int HeroAgent::SearchPickupObj() bool HeroAgent::PickupObjIsValid() { - if (curr_pickup_obj_.Get() && owner_->IsHuman()) { + if (curr_pickup_obj_.Get() && !curr_pickup_obj_.Get()->removing && owner_->IsHuman()) { if (curr_pickup_obj_.Get()->IsLoot()) { Loot* loot = curr_pickup_obj_.Get()->AsLoot(); return !loot->pickuped; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 87e7f42f..db09a77d 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -700,7 +700,7 @@ void Player::ProcInteraction() #ifdef MYDEBUG1 a8::XPrintf("LootInteraction %d\n", {obj_id}); #endif - if (entity) { + if (entity && !entity->removing) { if (entity->GetPos().Distance2D2(GetPos()) > 600) { #ifdef MYDEBUG1 a8::XPrintf("LootInteraction error3 %d\n", {entity->GetUniId()});