aozhiwei 3acef80048 1
2023-05-17 12:30:08 +08:00

358 lines
12 KiB
C++

#pragma once
#include "creature.h"
#include "GGListener.h"
#include "skin.h"
#include "framedata.h"
namespace cs
{
class MFPlayerFull;
class MFCharacterImage;
class MFPlayerStats;
class MFActivePlayerData;
class MFGasData;
class MFSettlement;
class MFTeamData;
class MFThrow;
class MFSandTableFullMsg;
class MFSandTablePartMsg;
class SMGameOver;
class SMUpdate;
}
namespace a8
{
class MutableXObject;
}
struct HumanBehavior
{
long long curr_start_destory_box_frameno = 0;
int curr_destory_box_times = 0;
int total_destory_box_times = 0;
};
struct KillInfo;
class CircleCollider;
class AabbCollider;
class Obstacle;
class RoomObstacle;
class Loot;
class Car;
class Buff;
class PlayerStats;
class Guide;
struct BornPoint;
class Human : public Creature
{
public:
int proto_version = 0;
int socket_handle = 0;
long ip_saddr = 0;
std::string account_id;
std::string session_id;
std::string from_appid;
std::string team_uuid;
int init_team_member_num = 0;
bool auto_fill = false;
int today_enter_times = 0;
int account_registertime = 0;
int channel = 0;
long long battle_uuid = 0;
int is_valid_battle = 0;
std::string payload;
HumanBehavior behavior;
const mt::Hero* meta = nullptr;
const mt::Equip* helmet_meta = nullptr;
const mt::Equip* chest_meta = nullptr;
a8::XTimerWp dead_timer;
int match_mode = 0;
std::shared_ptr<cs::MFThrow> throw_bomb;
std::map<int, std::shared_ptr<cs::MFThrow>> pending_throw_bomb;
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_frame = 0;
int sex = 0;
std::string user_data;
long long last_cmmove_frameno = 0;
bool disconnected = false;
int backpack = 0;
int helmet = 0;
int chest = 0;
int vip = 0;
long long join_frameno = 0;
long long enable_frameno = 0;
int emoji1 = 0;
int emoji2 = 0;
int parachute = 0;
bool has_pass = 0;
a8::XTimerWp revive_timer;
long long dead_frameno = 0;
long long real_dead_frameno = 0;
Weapon default_weapon;
int curr_scope_idx = 0;
bool need_sync_team_data = false;
bool need_sync_teammate_data = false;
std::shared_ptr<PlayerStats> stats;
int pain_killer_frameno = 0;
int pain_killer_lastingtime = 0;
a8::XTimerWp pain_killer_timer;
a8::XTimerWp shen_bao_timer;
a8::XTimerWp downed_timer;
std::set<Human*> kill_humans;
std::shared_ptr<BornPoint> born_point = nullptr;
a8::XTimerWp shot_hold_timer;
int series_shot_frames = 0;
float fly_distance = 0.0f;
long long send_msg_times = 0;
long long send_sand_table_msg_times = 0;
std::vector<Weapon> spec_weapons;
std::map<int, int> battlein_items;
Human* last_human_target = nullptr;
int game_times = 0;
int win_times = 0;
int kill_times = 0;
int rank = 0;
std::function<void(Human*)> on_grid_chg;
std::shared_ptr<a8::XObject> hero_dto;
std::shared_ptr<a8::XObject> weapon_dto1;
std::shared_ptr<a8::XObject> weapon_dto2;
Human();
virtual ~Human() override;
virtual void Initialize() override;
virtual float GetSpeed() override;
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 FillMFObjectImage(Room* room, Human* hum, cs::MFCharacterImage* image_data) override;
virtual void FillMFPlayerStats(cs::MFPlayerStats* stats);
void FillMFSandTableFullMsg(cs::MFSandTableFullMsg* full_data);
void FillMFSandTablePartMsg(cs::MFSandTablePartMsg* part_data);
virtual float GetRadius() override;
virtual float GetHitRadius() override;
virtual bool IsDead(Room* room) override;
virtual long long GetDeadFrameNo(Room* room) override;
virtual void OnBulletHit(IBullet* bullet) override;
virtual void OnExplosionHit(Explosion* explosion) override;
long long GetRealDeadFrameNo(Room* room);
void FillMFTeamData(Human* hum, cs::MFTeamData* team_data, bool is_game_over);
void CarShot(const glm::vec3& target_dir);
void BeKill(int killer_id, const std::string& killer_name, int weapon_id,
int real_killer_id, const std::string& real_killer_name);
virtual void DecHP(float dec_hp,
int killer_id, const std::string killer_name, int weapon_id,
int real_killer_id, const std::string real_killer_name,
float& real_dmg_out) override;
virtual void AddToNewObjects(Entity* entity) override;
virtual void AddToPartObjects(Entity* entity) override;
virtual void AddToImageObjects(Creature* c) override;
virtual void RemovePartObjects(Entity* entity) override;
virtual bool InNewObjects(Entity* target) override;
virtual bool InPartObjects(Entity* target) override;
virtual int GetPartObjectsCount() override;
virtual void RemoveObjects(Entity* entity) override;
virtual void AddOutObjects(Entity* entity) override;
virtual void RemoveOutObjects(Entity* entity) override;
virtual const mt::Hero* GetHeroMeta() override { return meta; };
bool HasLiveTeammate();
bool HasNoDownedTeammate();
int GetNearbyTeammateNum(float range);
void DoJump();
void DoGetOn(int obj_uniid);
void DoGetDown();
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);
void RecalcVolume();
void RecalcBaseAttr();
int GetVolume(int slot_id);
void SyncVolume(int slot_id);
void RecoverHp(int inc_hp);
void AddObserver(Human* observer);
void RemoveObserver(Human* observer);
bool HasObserver();
void TraverseObservers(std::function<void (Human*, bool&)> func);
void SendUpdateMsg();
template <typename T>
void SendNotifyMsg(T& msg)
{
if (socket_handle != 0) {
GGListener::Instance()->SendToClient(socket_handle, 0, msg);
}
}
void SendGameOver();
void FollowTarget(Human* target);
virtual void SendDebugMsg(const std::string& debug_msg) override;
void SendRollMsgEx(KillInfo& info,
const char* fmt,
std::initializer_list<a8::XValue> args
);
void UpdateAction();
void SendUIUpdate();
void SendWxVoip();
void SendSysPiaoMsg(const std::string& msg, int color, int duration);
void SendShowCountdown(const std::string& msg, int countdown);
void OnDie();
void FreeDownedTimer();
void FreeReviveTimer();
void SetSkin(int idx, int skin_id);
Skin* GetSkinByIdx(int idx);
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);
virtual void DropItems(Obstacle* obstacle) override;
void OnEnable();
void OnDisable();
virtual void UpdateMove() override;
Car* GetCar() { return car_; }
void SetCar(Car* car) { car_ = car; }
int GetSeat() { return seat_; }
void SetSeat(int seat) { seat_ = seat; }
void DeadDrop();
virtual std::string GetName() override { return name; };
void UpdateViewObjects();
void GMAddItem(int item_id, int item_num);
void ProcUseItem(int item_id);
void StartRefreshViewTimer();
void DoFollow(int target_id);
void DoDive();
void OnWatcherDie(Human* watcher);
FrameData& GetFrameData() { return framedata_; };
int GetOxygen() { return oxygen_; };
void SetOxygen(int oxygen) { oxygen_ = oxygen; };
void AddOxygen(int val);
void DecOxygen(int val);
void WinPveScore(int score);
int GetTeamMode();
void NotifyTeamMarkTargetPos();
void CalcAssists(Human* target);
void ProcThrowDmg(int throw_uniid);
void CalcStats();
void ShiledBreak();
std::shared_ptr<Guide> GetGuide() { return guide_; };
void SendNewBieEnd();
protected:
void ProcLootWeapon(AddItemDTO& dto);
void ProcLootSkin(AddItemDTO& dto);
void ProcLootCar(AddItemDTO& dto);
void ProcNormalItem(AddItemDTO& dto);
void ProcSpoils(AddItemDTO& dto);
void ProcLootBag(AddItemDTO& dto);
void ProcLootProtection(AddItemDTO& dto);
void ProcGiftPackage(AddItemDTO& dto);
void ProcLootSpecItem(AddItemDTO& dto);
void ProcGemStoneItem(AddItemDTO& dto);
void ProcLoveItem(AddItemDTO& dto);
void CancelRevive();
Weapon* TakeonWeapon(const mt::Equip* equip_meta);
void LootInteraction(Loot* entity);
void ProcAddItemDto(AddItemDTO& dto);
void DropWeapon(int weapon_idx, int num);
private:
void GenBattleReportData(a8::MutableXObject* params);
void FillSMGameOver(cs::SMGameOver& msg);
void SendBattleSettlement();
void SendBattleReport();
void Revive();
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 ProcReloadAction();
void ProcUseItemAction();
void ProcReliveAction();
void NextReload(int prev_weapon_id, int prev_weapon_idx);
void DoGetOnWithLoot(Loot* loot_entity);
void DoGetOnWithCar(Car* car);
void InternalBeKill(int killer_id, const std::string& killer_name, int weapon_id,
int real_killer_id, const std::string& real_killer_name);
virtual void AddBuffPostProc(Creature* caster, Buff* buff) override;
virtual void OnBuffRemove(Buff& buff) override;
virtual void DoSkillPreProc(int skill_id, int target_id) override;
virtual void DoSkillPostProc(bool used, int skill_id, int target_id) override;
void FillMFSettlement(cs::SMGameOver* msg, cs::MFSettlement* settlement);
protected:
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;
int oxygen_ = 0;
long long last_sync_gas_frameno = 0;
std::array<int, IS_END> volume_ = {};
Human* follow_target_ = nullptr;
bool follow_synced_active_player = false;
Car* car_ = nullptr;
int seat_ = 0;
std::set<Human*> view_objects_;
a8::XTimerWp refresh_view_timer_;
std::vector<Skin> skins;
bool statsed_ = false;
private:
FrameData framedata_;
std::set<Human*> observers_;
std::map<int, int> items_;
std::set<int> battling_items_;
size_t normal_drop_times_ = 0;
size_t box_drop_times_ = 0;
bool already_report_battle_ = false;
bool sending_battlereport_ = false;
bool is_game_end_ = false;
long long jump_frameno_ = 0;
float old_sync_speed = 0;
std::map<int, long long> attacker_hash_;
std::shared_ptr<Guide> guide_;
friend class PBUtils;
};