aozhiwei ba5229b31e 1
2021-03-18 18:50:08 +08:00

395 lines
13 KiB
C++

#pragma once
#include "creature.h"
#include "GGListener.h"
namespace MetaData
{
struct Player;
struct Equip;
struct Dress;
struct Skill;
struct Buff;
struct SkillPhase;
}
enum HumanStatus
{
HS_AlreadyLordMode = 1,
HS_Disable = 2,
HS_NewBieGuideAndroid = 3,
HS_AlreadyEquip = 5,
HS_AlreadyProcNewBieLogic = 6,
HS_LastAndroid = 7,
HS_DisableAttack = 8,
HS_End
};
struct xtimer_list;
class CircleCollider;
class AabbCollider;
class Obstacle;
class Loot;
class Car;
class Buff;
class Human : public Creature
{
public:
int socket_handle = 0;
long ip_saddr = 0;
int team_id = 0;
std::string account_id;
std::string session_id;
std::string from_appid;
std::string team_uuid;
bool auto_fill = false;
int today_enter_times = 0;
int account_registertime = 0;
int channel = 0;
MetaData::Player* meta = nullptr;
MetaData::Equip* helmet_meta = nullptr;
MetaData::Equip* chest_meta = nullptr;
MetaData::Dress* skin_jlf_meta = nullptr;
long long last_shot_frameno_ = 0;
std::function<void ()> on_loading_bullet;
std::string name;
std::string avatar_url;
long long user_value1 = 0;
long long user_value2 = 0;
long long user_value3 = 0;
long long guild_id = 0;
int vip_lv = 0;
int head = 0;
int sex = 0;
std::string user_data;
long long last_cmmove_frameno = 0;
bool downed = false;
bool disconnected = false;
int anim_type = 0;
int anim_seq = 0;
ActionType_e action_type = AT_None;
long long action_frameno = 0;
int action_duration = 0;
int action_item_id = 0;
int action_target_id = 0;
Skin skin_jlf;
int backpack = 0;
int helmet = 0;
int chest = 0;
int energy_shield = 0;
int max_energy_shield = 0;
int vip = 0;
int sdmg = 0;
bool poisoning = false;
long long poisoning_time = 0;
int lethal_weapon = 0;
long long join_frameno = 0;
long long enable_frameno = 0;
int status = 0;
float atk_add = 0.0f;
int emoji1 = 0;
int emoji2 = 0;
int parachute = 0;
bool has_pass = 0;
bool real_dead = false;
xtimer_list* revive_timer = nullptr;
int dead_times = 0;
bool aiming = false;
bool dead = false;
long long dead_frameno = 0;
long long real_dead_frameno = 0;
Weapon default_weapon;
Weapon car_weapon;
std::vector<Weapon> weapons;
Weapon* curr_weapon = nullptr;
int curr_scope_idx = 0;
bool need_sync_team_data = false;
bool need_sync_teammate_data = false;
bool need_sync_active_player = false;
PlayerStats stats;
int pain_killer_frameno = 0;
int pain_killer_lastingtime = 0;
xtimer_list* pain_killer_timer = nullptr;
xtimer_list* downed_timer = nullptr;
std::set<Human*>* team_members = nullptr;
std::set<Human*> kill_humans;
BornPoint* born_point = nullptr;
bool shot_start = false;
bool shot_hold = false;
int series_shot_frames = 0;
float fly_distance = 0.0f;
long long send_msg_times = 0;
std::list<Weapon> spec_weapons;
Weapon grow_weapon;
std::map<int, int> weapon_configs;
std::map<int, int> skin_configs;
std::map<int, int> spoils_items;
xtimer_list* ad_timer_ = nullptr;
Human* last_human_target = nullptr;
a8::Vec2 target_pos;
int game_times = 0;
int win_times = 0;
int kill_times = 0;
int rank = 0;
std::function<void(Human*)> on_grid_chg;
Human();
virtual ~Human() override;
virtual void Initialize() override;
virtual float GetSpeed() override;
virtual float GetSpeed4();
virtual void FillMFObjectPart(Room* room, Human* hum, cs::MFObjectPart* part_data) override;
void FillMFObjectLess(Room* room, Human* hum, cs::MFPlayerFull* full_data);
virtual void FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data) override;
virtual void FillMFPlayerStats(cs::MFPlayerStats* stats);
virtual void GetAabbBox(AabbCollider& aabb_box) override;
virtual bool IsDead(Room* room) override;
virtual long long GetDeadFrameNo(Room* room) override;
void FillItemList(::google::protobuf::RepeatedPtrField<::cs::MFPair>* pb_item_list);
long long GetRealDeadFrameNo(Room* room);
void FillMFTeamData(cs::MFTeamData* team_data, bool is_game_over);
void Shot(a8::Vec2& target_dir, bool& shot_ok);
void CarShot(a8::Vec2& target_dir);
void RecalcSelfCollider();
bool IsCollisionInMapService();
void FindPathInMapService();
float GetRadius();
float GetHP();
float GetMaxHP();
void UpdatePoisoning();
void AutoLoadingBullet(bool manual = false);
void StartAction(ActionType_e action_type,
int action_duration,
int item_id,
int target_id);
void CancelAction();
void ResetAction();
void BeKill(int killer_id, const std::string& killer_name, int weapon_id);
void DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id);
void AddToNewObjects(Entity* entity);
void AddToPartObjects(Entity* entity);
void RemovePartObjects(Entity* entity);
bool InPartObjects(Entity* target);
int GetPartObjectsCount();
void RemoveObjects(Entity* entity);
void AddOutObjects(Entity* entity);
void RemoveOutObjects(Entity* entity);
bool HasLiveTeammate();
bool HasNoDownedTeammate();
void DoJump();
virtual bool CanUseSkill(int skill_id) override;
virtual int SelectSkillId();
void DoGetOn(int obj_uniid);
void DoGetDown();
void FindLocation();
virtual void RefreshView() override;
virtual void OnGridListChange(std::set<GridCell*>& old_grids,
std::set<GridCell*>& inc_grids,
std::set<GridCell*>& dec_grids
) override;
virtual void SyncAroundPlayers(const char* file, int line, const char* func) override;
void FillMFActivePlayerData(cs::MFActivePlayerData* player_data);
void FillMFGasData(cs::MFGasData* gas_data);
bool CanSee(const Human* hum) const;
void RecalcVolume();
void RecalcBaseAttr();
int GetInventory(int slot_id);
void AddInventory(int slot_id, int num);
void DecInventory(int slot_id, int num);
int GetVolume(int slot_id);
void RecoverHp(int inc_hp);
void FillBodyState(::google::protobuf::RepeatedPtrField<::cs::MFBodyState>* states);
void SummonHero(int heroid);
void AddObserver(Human* observer);
void RemoveObserver(Human* observer);
void SendUpdateMsg();
template <typename T>
void SendNotifyMsg(T& msg)
{
GGListener::Instance()->SendToClient(socket_handle, 0, msg);
}
void SendGameOver();
void FollowTarget(Human* target);
virtual void SendDebugMsg(const std::string& debug_msg) override;
void SendRollMsg(const std::string& roll_msg);
void UpdateAction();
void SendUIUpdate();
void SendWxVoip();
void SendSysPiaoMsg(const std::string& msg, int color, int duration);
void SendShowCountdown(const std::string& msg, int countdown);
int GetWeaponConfigLv(int weapon_id);
int GetSkinConfigLv(int skin_id);
void OnDie();
void FreeDownedTimer();
void FreeReviveTimer();
void RandSkin();
void SetSkin(int idx, int skin_id);
Skin* GetSkinByIdx(int idx);
virtual void TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type) override;
int GetLevel() {return level_;};
int GetExp() {return exp_;};
void OnAttack() {};
void OnHit() {};
int GetItemNum(int item_id);
void AddItem(int item_id, int item_num);
void DecItem(int item_id, int item_num);
float GetAttrAbs(int attr_id);
float GetAttrRate(int attr_id);
bool IsPlayer() const;
bool IsAndroid() const;
void DropItems(Obstacle* obstacle);
void ProcNewBieLogic();
void OnEnable();
void OnDisable();
Entity* GetLastCollisionDoor() { return last_collision_door_; }
void SetLastCollisionDoor(Entity* door) { last_collision_door_ = door; }
ObjectSyncFlags* GetObjectSyncFlags(int obj_uniid);
bool HasSpecMove();
void _UpdateSpecMove();
void _UpdateMove(int speed);
RaceType_e GetRace() { return race_; }
void ChangeToRace(RaceType_e race, int level);
void ChangeToRaceAndNotify(RaceType_e race, int level);
void WinExp(Human* sender, int exp);
Car* GetCar() { return car_; }
void SetCar(Car* car) { car_ = car; }
int GetSeat() { return seat_; }
void SetSeat(int seat) { seat_ = seat; }
void DeadDrop();
bool IsEnemy(Human* hum);
protected:
void _InternalUpdateMove(float speed);
void ProcLootSkin(Loot* entity, MetaData::Equip* item_meta);
void ProcLootCar(Loot* entity, MetaData::Equip* item_meta);
void ProcCamoutflage(Loot* entity, MetaData::Equip* item_meta);
void ProcSpoils(Loot* entity, MetaData::Equip* item_meta);
virtual void SelectSkillTargets(const a8::Vec2& target_pos, std::set<Entity*>& target_list) override;
void AutoChgWeapon();
void CancelRevive();
private:
void ClearFrameData();
void GenBattleReportData(a8::MutableXObject* params);
void GenZbModeBattleReportData(a8::MutableXObject* params);
void FillSMGameOver(cs::SMGameOver& msg);
void SendBattleReport();
void FindLocationWithTarget(Entity* target);
void Revive();
void ClearLordMode();
void AdjustDecHp(float old_health, float& new_health);
void ClearPartObjects();
void GetViewObjects(std::set<Entity*>& view_objects);
void NotifyObservers(cs::SMUpdate* msg, cs::MFActivePlayerData* active_player_data_pb);
void ProcIncGridList(std::set<GridCell*>& old_grids,
std::set<GridCell*>& inc_grids,
std::set<GridCell*>& dec_grids);
void ProcDecGridList(std::set<GridCell*>& old_grids,
std::set<GridCell*>& inc_grids,
std::set<GridCell*>& dec_grids);
void RemoveFromScene();
void OnMetaChange();
void OnChgToTerminator();
void ProcReloadAction();
void OnLand();
void NextReload(int prev_weapon_id, int prev_weapon_idx);
void DoGetOnWithLoot(Loot* loot_entity);
void DoGetOnWithCar(Car* car);
virtual void AddBuffPostProc(Creature* caster, Buff* buff) override;
virtual void OnBuffRemove(const 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;
protected:
int level_ = 0;
int exp_ = 0;
long long hide_frameno_ = 0;
long long accelerate_frameno_ = 0;
long long damageadd_frameno_ = 0;
long long defadd_frameno_ = 0;
long long recover_hp_frameno_ = 0;
long long reflect_damage_frameno_ = 0;
long long summon_hero_frameno_ = 0;
long long last_sync_teamdata_frameno_ = 0;
bool leave_ = false;
long long leave_frameno_ = 0;
std::array<int, IS_END - 1> inventory_ = {};
std::array<int, IS_END> volume_ = {};
std::set<Entity*> new_objects;
std::set<Entity*> part_objects;
std::set<int> del_objects;
std::set<int> out_objects;
std::vector<int> shots_;
std::vector<int> emotes_;
std::vector<int> bullets_;
std::vector<int> smokes_;
std::vector<int> explosions_;
std::vector<int> chged_buffs_;
std::set<Human*> observers_;
std::vector<int> chged_bullet_nums_;
std::vector<int> chged_hps_;
std::vector<int> chged_skillcds_;
std::vector<int> chged_items_;
std::vector<int> chged_weapon_ammo_;
std::vector<int> chged_level_;
std::vector<int> chged_exp_;
std::vector<int> chged_race_;
std::vector<int> chged_zombieid_;
std::vector<int> dead_alive_objs_;
std::vector<int> chged_cars_;
Human* follow_target_ = nullptr;
bool follow_synced_active_player = false;
Car* car_ = nullptr;
int seat_ = 0;
private:
RaceType_e race_ = kHumanRace;
CircleCollider* self_collider_ = nullptr;
long long last_sync_gas_frameno = 0;
std::map<int, int> items_;
std::set<int> battling_items_;
size_t normal_drop_times_ = 0;
size_t box_drop_times_ = 0;
std::array<ObjectSyncFlags, FIXED_OBJECT_MAXID> fixed_object_sync_flags_ = {};
bool already_report_battle_ = false;
bool sent_battlereport_ = false;
bool sent_game_end_ = false;
std::vector<Skin> skins;
Entity* last_collision_door_ = nullptr;
long long jump_frameno_ = 0;
bool use_skill = false;
friend class FrameMaker;
friend class FrameEvent;
};
void InternalShot(Human* hum,
MetaData::Equip* weapon_meta,
MetaData::EquipUpgrade* weapon_upgrade_meta,
MetaData::Equip* bullet_meta,
int weapon_lv,
int skill_id,
float fly_distance,
bool is_tank_skin);