This commit is contained in:
aozhiwei 2022-09-28 16:43:21 +08:00
commit c4dcbe431f
15 changed files with 158 additions and 42 deletions

View File

@ -945,7 +945,7 @@ void Buff::ProcMachineGun()
} }
} }
caster_.Get()->need_sync_active_player = true; caster_.Get()->need_sync_active_player = true;
caster_.Get()->SyncAroundPlayers(__FILE__, __LINE__, __func__); caster_.Get()->UpdateCharImage(__FILE__, __LINE__, __func__);
} }
} }

View File

@ -326,7 +326,7 @@ void InternalShot(Creature* c,
bullet_born_offset = a8::Vec2(v.z *10*1, v.x*10*-1); bullet_born_offset = a8::Vec2(v.z *10*1, v.x*10*-1);
bullet_born_pos = c->GetPos() + bullet_born_offset; bullet_born_pos = c->GetPos() + bullet_born_offset;
if (c->IsPlayer() || c->IsCar()) { if (c->IsPlayer() || c->IsCar()) {
#ifdef DEBUG #ifdef DEBUG1
a8::XPrintf("idx:%d offset:%f,%f angle:%f old_angle:%f angle_xy:%f,%f %f %f gun_muzzle_position:%f,%f,%f pos:%f,%f gun_id:%d\n", a8::XPrintf("idx:%d offset:%f,%f angle:%f old_angle:%f angle_xy:%f,%f %f %f gun_muzzle_position:%f,%f,%f pos:%f,%f gun_id:%d\n",
{ {
i, i,

View File

@ -112,6 +112,7 @@ class Creature : public MoveableEntity
virtual void AddToNewObjects(Entity* entity) {}; virtual void AddToNewObjects(Entity* entity) {};
virtual void AddToPartObjects(Entity* entity) {}; virtual void AddToPartObjects(Entity* entity) {};
virtual void RemovePartObjects(Entity* entity) {}; virtual void RemovePartObjects(Entity* entity) {};
virtual void AddToImageObjects(Creature* c) {};
virtual bool InNewObjects(Entity* target) { return false; }; virtual bool InNewObjects(Entity* target) { return false; };
virtual bool InPartObjects(Entity* target) { return false; }; virtual bool InPartObjects(Entity* target) { return false; };
virtual int GetPartObjectsCount() { return 0; }; virtual int GetPartObjectsCount() { return 0; };
@ -123,6 +124,7 @@ class Creature : public MoveableEntity
virtual bool IsCreature(Room* room) override { return true;}; virtual bool IsCreature(Room* room) override { return true;};
virtual void OnBattleStart(Room* room) override; virtual void OnBattleStart(Room* room) override;
virtual MetaData::Player* GetHeroMeta() { return nullptr; }; virtual MetaData::Player* GetHeroMeta() { return nullptr; };
virtual void FillMFObjectImage(Room* room, Human* hum, cs::MFCharacterImage* image_data) {};
bool HasBuffEffect(int buff_effect_id); bool HasBuffEffect(int buff_effect_id);
Buff* GetBuffByEffectId(int effect_id); Buff* GetBuffByEffectId(int effect_id);
Buff* GetBuffById(int buff_id); Buff* GetBuffById(int buff_id);

View File

@ -9,6 +9,9 @@ void FrameData::ClearFrameData(Human* hum)
if (!new_objects.empty()) { if (!new_objects.empty()) {
new_objects.clear(); new_objects.clear();
} }
if (!image_objects.empty()) {
image_objects.clear();
}
if (!block_objects.empty()) { if (!block_objects.empty()) {
if (hum->IsAndroid() && !hum->HasObserver()) { if (hum->IsAndroid() && !hum->HasObserver()) {
block_objects.clear(); block_objects.clear();

View File

@ -19,6 +19,7 @@ class FrameData
private: private:
std::map<int, EntityWeakPtr> new_objects; std::map<int, EntityWeakPtr> new_objects;
std::map<int, CreatureWeakPtr> image_objects;
std::map<int, EntityWeakPtr> block_objects; std::map<int, EntityWeakPtr> block_objects;
std::map<int, EntityWeakPtr> loot_objects; std::map<int, EntityWeakPtr> loot_objects;
std::map<int, PartObject> part_objects; std::map<int, PartObject> part_objects;

View File

@ -98,6 +98,7 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum)
SerializeLootObjects(msg, room, hum, framedata); SerializeLootObjects(msg, room, hum, framedata);
SerializeMapBlockObjects(msg, room, hum, framedata); SerializeMapBlockObjects(msg, room, hum, framedata);
SerializeNewObjects(msg, room, hum, framedata); SerializeNewObjects(msg, room, hum, framedata);
SerializeImageObjects(msg, room, hum, framedata);
SerializePartObjects(msg, room, hum, framedata); SerializePartObjects(msg, room, hum, framedata);
SerializeDelObjects(msg, room, hum, framedata); SerializeDelObjects(msg, room, hum, framedata);
SerializeOutObjects(msg, room, hum, framedata); SerializeOutObjects(msg, room, hum, framedata);
@ -225,6 +226,16 @@ void FrameMaker::SerializeNewObjects(cs::SMUpdate* msg, Room* room, Human* hum,
} }
} }
void FrameMaker::SerializeImageObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata)
{
for (auto& pair : framedata->image_objects) {
Creature* c = pair.second.Get();
if (c) {
c->FillMFObjectImage(room, (Human*)hum, msg->add_image_objects());
}
}
}
void FrameMaker::SerializePartObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) void FrameMaker::SerializePartObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata)
{ {
if (!framedata->part_objects.empty()) { if (!framedata->part_objects.empty()) {

View File

@ -20,6 +20,7 @@ private:
void SerializeLootObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); void SerializeLootObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata);
void SerializeMapBlockObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); void SerializeMapBlockObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata);
void SerializeNewObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); void SerializeNewObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata);
void SerializeImageObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata);
void SerializePartObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); void SerializePartObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata);
void SerializeDelObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); void SerializeDelObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata);
void SerializeOutObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); void SerializeOutObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata);

View File

@ -43,12 +43,12 @@ public:
virtual void OnRemoveFromTargetPartObject(Entity* target) override; virtual void OnRemoveFromTargetPartObject(Entity* target) override;
virtual void OnBattleStart(Room* room) override; virtual void OnBattleStart(Room* room) override;
void Destory(); void Destory();
void BeKill(int killer_id, const std::string& killer_name, int weapon_id);
protected: protected:
virtual void _UpdateMove(int speed) override; virtual void _UpdateMove(int speed) override;
void InternalUpdateMove(float speed); void InternalUpdateMove(float speed);
virtual void RecalcSelfCollider() override; virtual void RecalcSelfCollider() override;
void BeKill(int killer_id, const std::string& killer_name, int weapon_id);
void InitAI(); void InitAI();
void DetachFromMaster(); void DetachFromMaster();

View File

@ -577,6 +577,13 @@ void Human::FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data
} }
} }
void Human::FillMFObjectImage(Room* room, Human* hum, cs::MFCharacterImage* image_data)
{
image_data->set_obj_uniid(GetUniId());
image_data->set_cur_weapon_idx(GetCurrWeapon()->weapon_idx);
GetCurrWeapon()->ToPB(this, image_data->mutable_weapon());
}
void Human::FillMFPlayerStats(cs::MFPlayerStats* stats_pb) void Human::FillMFPlayerStats(cs::MFPlayerStats* stats_pb)
{ {
stats_pb->set_player_id(GetUniId()); stats_pb->set_player_id(GetUniId());
@ -1246,6 +1253,11 @@ void Human::AddToNewObjects(Entity* entity)
} }
} }
void Human::AddToImageObjects(Creature* c)
{
framedata_.image_objects[c->GetUniId()] = c->GetWeakPtrRef();
}
void Human::AddToPartObjects(Entity* entity) void Human::AddToPartObjects(Entity* entity)
{ {
#ifdef DEBUG1 #ifdef DEBUG1

View File

@ -239,6 +239,7 @@ class Human : public Creature
virtual void FillMFObjectPart(Room* room, Human* hum, cs::MFObjectPart* part_data) override; virtual void FillMFObjectPart(Room* room, Human* hum, cs::MFObjectPart* part_data) override;
void FillMFObjectLess(Room* room, Human* hum, cs::MFPlayerFull* full_data); void FillMFObjectLess(Room* room, Human* hum, cs::MFPlayerFull* full_data);
virtual void FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data) override; 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 void FillMFPlayerStats(cs::MFPlayerStats* stats);
virtual float GetRadius() override; virtual float GetRadius() override;
virtual float GetHitRadius() override; virtual float GetHitRadius() override;
@ -258,6 +259,7 @@ class Human : public Creature
virtual void DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id) override; 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 AddToNewObjects(Entity* entity) override;
virtual void AddToPartObjects(Entity* entity) override; virtual void AddToPartObjects(Entity* entity) override;
virtual void AddToImageObjects(Creature* c) override;
virtual void RemovePartObjects(Entity* entity) override; virtual void RemovePartObjects(Entity* entity) override;
virtual bool InNewObjects(Entity* target) override; virtual bool InNewObjects(Entity* target) override;
virtual bool InPartObjects(Entity* target) override; virtual bool InPartObjects(Entity* target) override;

View File

@ -5,6 +5,7 @@
#include "human.h" #include "human.h"
#include "metamgr.h" #include "metamgr.h"
#include "hero.h" #include "hero.h"
#include "player.h"
void Incubator::Init() void Incubator::Init()
{ {
@ -287,27 +288,19 @@ void Incubator::SpawnWaveMon(int wave)
#ifdef DEBUG #ifdef DEBUG
a8::XPrintf("SpawnWaveMon wave:%d \n", {wave}); a8::XPrintf("SpawnWaveMon wave:%d \n", {wave});
#endif #endif
auto& mons = room->pve_mode_meta->waves[wave]; auto cb =
for (MetaData::PveGeminiContent* content : mons) {
for (int i = 0; i < content->enemys.size(); ++i) {
room->xtimer.AddDeadLineTimerAndAttach
(
i == 0 ? 0 : 1000 / FRAME_RATE_MS,
a8::XParams()
.SetSender(this)
.SetParam1(content)
.SetParam2(room)
.SetParam3(i),
[] (const a8::XParams& param) [] (const a8::XParams& param)
{ {
Incubator* incubator = (Incubator*)param.sender.GetUserData();
MetaData::PveGeminiContent* content = (MetaData::PveGeminiContent*)param.param1.GetUserData(); MetaData::PveGeminiContent* content = (MetaData::PveGeminiContent*)param.param1.GetUserData();
Room* room = (Room*)param.param2.GetUserData(); Room* room = incubator->room;
int wave = param.param3.GetInt(); int wave = param.param2.GetInt();
int monIdx = param.param3.GetInt();
#ifdef DEBUG #ifdef DEBUG
a8::XPrintf("wave i:%d enemys_size:%d\n", {wave, content->enemys.size()}); a8::XPrintf("wave i:%d enemys_size:%d\n", {wave, content->enemys.size()});
#endif #endif
if (param.param3.GetInt() < content->enemys.size()) { if (monIdx < content->enemys.size()) {
int enemy_id = content->enemys[param.param3.GetInt()]; int enemy_id = content->enemys[monIdx];
MetaData::Player* hero_meta = MetaMgr::Instance()->GetPlayer(enemy_id); MetaData::Player* hero_meta = MetaMgr::Instance()->GetPlayer(enemy_id);
if (hero_meta) { if (hero_meta) {
a8::Vec2 hero_pos = content->spawn_point; a8::Vec2 hero_pos = content->spawn_point;
@ -326,15 +319,50 @@ void Incubator::SpawnWaveMon(int wave)
if (!hero) { if (!hero) {
A8_ABORT(); A8_ABORT();
} }
#ifdef DEBUG
{
room->xtimer.AddDeadLineTimerAndAttach
(
SERVER_FRAME_RATE * (rand() % 3),
a8::XParams()
.SetSender(hero),
[] (const a8::XParams& param)
{
Hero* hero = (Hero*)param.sender.GetUserData();
Human* hum = hero->room->GetOneAlivePlayer();
if (hum) {
hero->BeKill(hum->GetUniId(), hum->name, hum->GetCurrWeapon()->weapon_id);
} else {
hero->BeKill(VP_Gas, TEXT("battle_server_killer_gas", "毒圈"), VW_Gas);
}
},
&hero->xtimer_attacher.timer_list_);
}
#endif
if (wave + 1 == room->pve_mode_meta->waves.size()) { if (wave + 1 == room->pve_mode_meta->waves.size()) {
hero->is_pve_boss = true; hero->is_pve_boss = true;
#ifdef DEBGU
a8::XPrintf("pve_boss appear\n", {});
#endif
} }
++room->pve_data.mon_num; ++room->pve_data.mon_num;
room->NotifyUiUpdate(); room->NotifyUiUpdate();
} }
} }
}, };
auto& mons = room->pve_mode_meta->waves[wave];
for (MetaData::PveGeminiContent* content : mons) {
for (int i = 0; i < content->enemys.size(); ++i) {
room->xtimer.AddDeadLineTimerAndAttach
(
i == 0 ? 0 : 1000 / FRAME_RATE_MS,
a8::XParams()
.SetSender(this)
.SetParam1(content)
.SetParam2(wave)
.SetParam3(i),
cb,
&xtimer_attacher_.timer_list_); &xtimer_attacher_.timer_list_);
} }
room->pve_data.refreshed_mon += content->enemys.size(); room->pve_data.refreshed_mon += content->enemys.size();

View File

@ -64,6 +64,19 @@ void MoveableEntity::SyncAroundPlayers(const char* file, int line, const char* f
}); });
} }
void MoveableEntity::UpdateCharImage(const char* file, int line, const char* func)
{
if (IsCreature(room)) {
Creature* c = (Creature*)this;
TraverseAllLayerHumanList
(
[c, file, line, func] (Human* hum, bool& stop)
{
hum->AddToImageObjects(c);
});
}
}
void MoveableEntity::TraverseCreatures(std::function<void (Creature*, bool&)> func) void MoveableEntity::TraverseCreatures(std::function<void (Creature*, bool&)> func)
{ {
room->grid_service->TraverseCreatures(room->GetRoomIdx(), room->grid_service->TraverseCreatures(room->GetRoomIdx(),
@ -81,6 +94,19 @@ void MoveableEntity::SetAttackDir(const a8::Vec2& attack_dir)
{ {
attack_dir_ = attack_dir; attack_dir_ = attack_dir;
++chg_attack_dir_times_; ++chg_attack_dir_times_;
#ifdef DEBUG
if (IsCreature(room) && ((Creature*)this)->IsPlayer()) {
Creature* c = (Creature*)this;
c->SendDebugMsg(
a8::Format("SetAttackDir:%f,%f angle:%f\n",
{
attack_dir.x,
attack_dir.y,
GetAttackDirRotate()
})
);
}
#endif
} }
float MoveableEntity::GetAttackDirRotate() float MoveableEntity::GetAttackDirRotate()

View File

@ -23,6 +23,7 @@ class MoveableEntity : public RoomEntity
std::set<GridCell*>& dec_grids std::set<GridCell*>& dec_grids
); );
virtual void SyncAroundPlayers(const char* file, int line, const char* func); virtual void SyncAroundPlayers(const char* file, int line, const char* func);
virtual void UpdateCharImage(const char* file, int line, const char* func);
virtual const a8::Vec2& GetMoveDir() { return move_dir_; }; virtual const a8::Vec2& GetMoveDir() { return move_dir_; };
virtual void SetMoveDir(const a8::Vec2& move_dir); virtual void SetMoveDir(const a8::Vec2& move_dir);
virtual const a8::Vec2& GetAttackDir() { return attack_dir_; }; virtual const a8::Vec2& GetAttackDir() { return attack_dir_; };

View File

@ -63,6 +63,9 @@ void PveData::OnBeKill(Hero* hero)
} }
); );
pve_kill_boss = true; pve_kill_boss = true;
#ifdef DEBUG
a8::XPrintf("onKill pve_boss\n", {});
#endif
} }
#ifdef DEBUG #ifdef DEBUG

View File

@ -219,6 +219,14 @@ message MFAttrAddition
optional float rate_val = 3; // optional float rate_val = 3; //
} }
//-full信息则忽略
message MFCharacterImage
{
optional int32 obj_uniid = 1; //id
optional int32 cur_weapon_idx = 2; // 0-4
optional MFWeapon weapon = 3; //
}
//- //-
message MFPlayerFull message MFPlayerFull
{ {
@ -486,7 +494,23 @@ message MFActivePlayerData
repeated int32 inventory = 11; // repeated int32 inventory = 11; //
optional int32 cur_weapon_idx = 15; // 0-4 optional int32 cur_weapon_idx = 15; // 0-4
repeated MFWeapon weapons = 16; //1-4 0 1 2 3 4 /*
1-4
0
11
22
3
4
5:
6:
7:
8:
9: c4
10:
11:
12:
*/
repeated MFWeapon weapons = 16;
optional int32 energy_shield = 40; // optional int32 energy_shield = 40; //
optional int32 max_energy_shield = 41; // optional int32 max_energy_shield = 41; //
@ -1129,6 +1153,8 @@ message SMUpdate
optional int32 game_left_time = 45; //(, ) optional int32 game_left_time = 45; //(, )
optional int32 frameno = 46; optional int32 frameno = 46;
repeated int32 del_bullets = 47; // repeated int32 del_bullets = 47; //
repeated MFCharacterImage image_objects = 50; //-full信息则忽略
} }
// //