This commit is contained in:
aozhiwei 2021-06-18 17:29:06 +08:00
parent 4022545a6e
commit e44c3efac4
6 changed files with 49 additions and 0 deletions

View File

@ -10,6 +10,8 @@
#include "typeconvert.h"
#include "bullet.h"
#include "perfmonitor.h"
#include "roomobstacle.h"
#include "loot.h"
enum ObstacleDataFlags_e
{
@ -570,6 +572,18 @@ void Obstacle::OnBulletHit(Bullet* bullet)
((bullet->gun_meta->special_damage_type & meta->receive_special_damage_type) == 0)) {
return;
}
if (meta->i->thing_type() == kObstacleOilBucket) {
Entity* real_object = AsRoomObstacle()->GetRealObject(bullet->room);
if (real_object->IsEntityType(ET_Loot)) {
Loot* loot = (Loot*)real_object;
if (loot->pickuped) {
return;
}
loot->pickuped = true;
bullet->room->RemoveObjectLater(loot);
bullet->room->RemoveObjectLater(AsRoomObstacle());
}
}
float dmg = bullet->GetAtk() * (1 + bullet->sender.Get()->GetAttrRate(kHAT_Atk)) +
bullet->sender.Get()->GetAttrAbs(kHAT_Atk);
float def = 0;
@ -761,3 +775,13 @@ bool Obstacle::IsOpenInteraction()
{
return meta->i->interaction_mode() == 2;
}
bool Obstacle::IsRoomObstacle()
{
return !IsPermanent();
}
RoomObstacle* Obstacle::AsRoomObstacle()
{
return (RoomObstacle*)this;
}

View File

@ -20,6 +20,7 @@ class Building;
class CircleCollider;
class AabbCollider;
class Bullet;
class RoomObstacle;
class Obstacle : public Entity
{
public:
@ -69,6 +70,8 @@ class Obstacle : public Entity
bool Throughable();
bool IsTouchInteraction();
bool IsOpenInteraction();
bool IsRoomObstacle();
RoomObstacle* AsRoomObstacle();
protected:
Obstacle();
@ -97,3 +100,4 @@ protected:
friend class EntityFactory;
};

View File

@ -752,6 +752,19 @@ void Player::LootInteraction(Loot* entity)
}
entity->pickuped = true;
room->RemoveObjectLater(entity);
if (entity->dummy_thing_uniid != 0) {
Entity* dummy_obj = room->GetEntityByUniId(entity->dummy_thing_uniid);
if (dummy_obj && dummy_obj->GetEntityType() == ET_Obstacle) {
Obstacle* obstacle = (Obstacle*)dummy_obj;
if (!obstacle->IsPermanent()) {
if (!obstacle->IsDead(room)) {
obstacle->Die(room);
obstacle->BroadcastFullState(room);
}
room->RemoveObjectLater((RoomObstacle*)obstacle);
}
}
}
}
void Player::HumanInteraction(Human* hum)

View File

@ -558,6 +558,7 @@ int Room::CreateLootEx(int equip_id, a8::Vec2 born_pos, a8::Vec2 pos, int count,
}
RoomObstacle* dummy_obj = CreateObstacle(equip_meta->int_param1, pos.x, pos.y);
entity->dummy_thing_uniid = dummy_obj->GetUniId();
dummy_obj->real_object_uniid = entity->GetUniId();
}
return entity->GetUniId();
} else {

View File

@ -582,3 +582,8 @@ void RoomObstacle::SummonAirDropBox(int box_id)
);
}
Entity* RoomObstacle::GetRealObject(Room* room)
{
return room->GetEntityByUniId(real_object_uniid);
}

View File

@ -12,6 +12,7 @@ class RoomObstacle : public Obstacle
bool is_treasure_box = false;
bool is_terminator_airdrop_box = false;
CreatureWeakPtr master;
int real_object_uniid = 0;
virtual ~RoomObstacle() override;
virtual void Initialize() override;
@ -25,6 +26,7 @@ class RoomObstacle : public Obstacle
void DetachFromMaster();
virtual void Die(Room* room) override;
virtual void Explosion() override;
Entity* GetRealObject(Room* room);
private:
void SpecExplosion();