aozhiwei 83e6d9e7c7 1
2022-10-25 20:58:29 +08:00

436 lines
14 KiB
C++

#pragma once
#include "creature.h"
#include "GGListener.h"
#include "skin.h"
#include "framedata.h"
namespace MetaData
{
struct Player;
struct Equip;
struct Dress;
struct Skill;
struct Buff;
struct SkillPhase;
}
struct HumanBehavior
{
long long curr_start_destory_box_frameno = 0;
int curr_destory_box_times = 0;
int total_destory_box_times = 0;
};
struct WeaponStats
{
int weapon_id = 0;
int kills = 0;
int damage_out = 0;
int obtain_count = 0;
int use_times = 0;
};
struct HeroStats
{
int hero_id = 0;
int skill_lv = 0;
int weapon_lv = 0;
};
struct OverRewardItem
{
std::string uniid;
int id = 0;
std::string obtain_gold;
std::string gold_limit;
std::string curr_gold;
};
struct OverReward
{
OverRewardItem hero;
OverRewardItem weapon1;
OverRewardItem weapon2;
std::string total_ceg;
std::vector<std::tuple<int, std::string>> items;
};
struct PlayerStats
{
int kills = 0;
long long last_kill_frameno = 0;
int damage_amount_in = 0;
int damage_amount_out = 0;
int heal_amount = 0;
int rescue_member = 0;
int rescue_guild_member = 0;
int history_time_alive = 0;
int history_kills = 0;
int history_damage_amount = 0;
int history_heal_amount = 0;
int diving_times = 0;
int open_airdrop_times = 0;
int use_medicine_times = 0;
int destory_car_times = 0;
int use_camouflage_times = 0;
int use_skill_times = 0;
int ride_car_move_distance = 0;
int ride_car_kills = 0;
int max_hero_skill_lv = 0;
std::map<int, WeaponStats> weapon_stats;
std::map<int, HeroStats> hero_stats;
int gold = 0;
int score = 0;
std::vector<std::pair<int, int>> items;
int pass_score = 0;
int rank_score = 0;
int pve_rank_score = 0;
int pve_kill_boss = 0;
std::vector<std::pair<int, int>> extra_drop;
int killer_id = 0;
std::string killer_name;
int weapon_id = 0;
int rank = 0;
int skill_times = 0;
bool victory = false;
int dead_times = 0;
OverReward over_reward;
int statemented = false;
double ranked_topx = 0;
double kills_topx = 0;
double hero_topx = 0;
double weapon_topx = 0;
double survival_topx = 0;
::cs::MFHeroStats pb_hero_stats;
::google::protobuf::RepeatedPtrField<::cs::MFWeaponStats> pb_weapons_stats;
WeaponStats& MustBeWeapon(int weapon_id);
void IncWeaponKills(int weapon_id, int val);
void IncWeaponDamageOut(int weapon_id, int val);
void IncWeaponObtainCount(int weapon_id, int val);
void IncWeaponUseTimes(int weapon_id, int val);
HeroStats& MustBeHero(int hero_id);
void SetHeroSkillLv(int hero_id, int skill_lv);
void SetHeroWeaponLv(int hero_id, int weapon_lv);
void ParseReward(Human* hum, a8::XObject& xobj);
void AdjustRewardData();
void Statement(Human* hum);
};
struct xtimer_list;
struct KillInfo;
class CircleCollider;
class AabbCollider;
class Obstacle;
class RoomObstacle;
class Loot;
class Car;
class Buff;
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;
MetaData::Player* meta = nullptr;
MetaData::Equip* helmet_meta = nullptr;
MetaData::Equip* chest_meta = nullptr;
xtimer_list* dead_timer = nullptr;
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 energy_shield = 0;
int max_energy_shield = 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;
xtimer_list* revive_timer = nullptr;
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;
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*> kill_humans;
struct BornPoint* born_point = nullptr;
bool shot_start = false;
bool shot_hold = false;
xtimer_list* shot_hold_timer = nullptr;
int series_shot_frames = 0;
float fly_distance = 0.0f;
long long send_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 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 FillMFObjectImage(Room* room, Human* hum, cs::MFCharacterImage* image_data) override;
virtual void FillMFPlayerStats(cs::MFPlayerStats* stats);
virtual float GetRadius() override;
virtual float GetHitRadius() override;
virtual void GetAabbBox(AabbCollider& aabb_box) override;
virtual void GetHitAabbBox(AabbCollider& aabb_box) override;
virtual bool IsDead(Room* room) override;
virtual long long GetDeadFrameNo(Room* room) override;
virtual void OnBulletHit(Bullet* bullet) override;
virtual void OnExplosionHit(Explosion* explosion) override;
void FillItemList(::google::protobuf::RepeatedPtrField<::cs::MFPair>* pb_item_list);
long long GetRealDeadFrameNo(Room* room);
void FillMFTeamData(Human* hum, cs::MFTeamData* team_data, bool is_game_over);
void CarShot(const a8::Vec2& target_dir);
virtual void RecalcSelfCollider() override;
void FindPathInMapService();
void BeKill(int killer_id, const std::string& killer_name, int weapon_id);
virtual void DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id) 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 MetaData::Player* 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 RecoverHp(int inc_hp);
void FillBodyState(::google::protobuf::RepeatedPtrField<::cs::MFBodyState>* states);
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();
ObjectSyncFlags* GetObjectSyncFlags(int obj_uniid);
virtual void _UpdateMove(int speed) 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);
protected:
void _InternalUpdateMove(float speed);
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 CancelRevive();
Weapon* TakeonWeapon(MetaData::Equip* equip_meta);
void LootInteraction(Loot* entity);
void ProcAddItemDto(AddItemDTO& dto);
void DropWeapon(int weapon_idx);
private:
void GenBattleReportData(a8::MutableXObject* params);
void FillSMGameOver(cs::SMGameOver& msg);
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 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(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:
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_;
xtimer_list* refresh_view_timer_ = nullptr;
std::vector<Skin> skins;
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;
std::array<ObjectSyncFlags, FIXED_OBJECT_MAXID> fixed_object_sync_flags_ = {};
bool already_report_battle_ = false;
bool sending_battlereport_ = false;
bool is_game_end_ = false;
long long jump_frameno_ = 0;
float old_sync_speed = 0;
};