358 lines
12 KiB
C++
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;
|
|
};
|