2022-10-26 13:04:43 +08:00

98 lines
2.7 KiB
C++

#pragma once
#include "moveableentity.h"
#include "weakptr.h"
namespace MetaData
{
struct Player;
struct Equip;
struct Skill;
}
class Human;
class Obstacle;
class Creature;
class CircleCollider;
class MovementComponent;
class Car;
class Ability;
class Bullet : public MoveableEntity, public IBullet
{
public:
long long weapon_uniid = 0;
int gun_lv = 0;
MetaData::Equip* gun_meta = nullptr;
MetaData::Equip* meta = nullptr;
MetaData::Skill* skill_meta = nullptr;
CreatureWeakPtr sender;
CreatureWeakPtr passenger;
a8::Vec2 dir;
a8::Vec2 born_pos;
a8::Vec2 born_dir;
float fly_distance = 0.0f;
MovementComponent* movement = nullptr;
int trace_target_id = 0;
float strengthen_wall = 0;
int hand = 0;
std::weak_ptr<a8::XTimerPtr> keep_shot_animi_timer_ptr;
float shot_animi_time = 0.0f;
virtual ~Bullet() override;
virtual void Initialize() override;
virtual void Update(int delta_time) override;
void RecalcSelfCollider();
float GetAtk();
float GetExplosionRange();
bool IsCurrWeapon();
void ForceRemove();
void OnHit(std::set<Entity*>& objects);
void TriggerHitBuff(Entity* e);
bool IsFlyHook();
virtual float GetStrengthenWall() override { return strengthen_wall; };
virtual long long GetWeaponUniId() override { return weapon_uniid; };
virtual MetaData::Skill* GetSkillMeta() override {return skill_meta; };
virtual MetaData::Equip* GetGunMeta() override { return gun_meta; };
virtual MetaData::Equip* GetBulletMeta() override { return meta; };
virtual CreatureWeakPtr GetSender() override { return sender; };
virtual CreatureWeakPtr GetPassenger() { return passenger; };
virtual bool IsBomb();
virtual bool IsPreBattleBullet();
virtual Room* GetRoom() { return room; };
protected:
Bullet();
private:
void ProcBomb();
void ProcSmokeBomb();
void ProcFragBomb(int delay_time);
void ProcPosionGasBomb(int delay_time);
void ProcMolotorCocktailBomb(int delay_time);
void ProcC4Bomb(Car* target, int delay_time);
void ProcSignalGunBomb(int delay_time);
void ProcShieldWallBomb(int delay_time);
void ProcOilBucketBomb(int delay_time);
void ProcFlyHook(Entity* target);
inline void MapServiceUpdate();
void Check(float distance);
void AddGunBuff();
void OnKillTarget(Entity* target);
void OnStrengthen(Obstacle* ob);
void ClearBuffList();
private:
CircleCollider* self_collider_ = nullptr;
bool later_removed_ = false;
std::shared_ptr<Ability> ability_;
bool is_curr_weapon = false;
std::set<int> hit_objects_;
long long create_frameno_ = 0;
bool strengthened_ = false;
std::list<int> buff_list_;
friend class EntityFactory;
};