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()->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_pos = c->GetPos() + bullet_born_offset;
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",
{
i,

View File

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

View File

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

View File

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

View File

@ -98,6 +98,7 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum)
SerializeLootObjects(msg, room, hum, framedata);
SerializeMapBlockObjects(msg, room, hum, framedata);
SerializeNewObjects(msg, room, hum, framedata);
SerializeImageObjects(msg, room, hum, framedata);
SerializePartObjects(msg, room, hum, framedata);
SerializeDelObjects(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)
{
if (!framedata->part_objects.empty()) {

View File

@ -20,6 +20,7 @@ private:
void SerializeLootObjects(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 SerializeImageObjects(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 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 OnBattleStart(Room* room) override;
void Destory();
void BeKill(int killer_id, const std::string& killer_name, int weapon_id);
protected:
virtual void _UpdateMove(int speed) override;
void InternalUpdateMove(float speed);
virtual void RecalcSelfCollider() override;
void BeKill(int killer_id, const std::string& killer_name, int weapon_id);
void InitAI();
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)
{
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)
{
#ifdef DEBUG1

View File

@ -239,6 +239,7 @@ class Human : public Creature
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;
@ -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 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;

View File

@ -5,6 +5,7 @@
#include "human.h"
#include "metamgr.h"
#include "hero.h"
#include "player.h"
void Incubator::Init()
{
@ -287,6 +288,69 @@ void Incubator::SpawnWaveMon(int wave)
#ifdef DEBUG
a8::XPrintf("SpawnWaveMon wave:%d \n", {wave});
#endif
auto cb =
[] (const a8::XParams& param)
{
Incubator* incubator = (Incubator*)param.sender.GetUserData();
MetaData::PveGeminiContent* content = (MetaData::PveGeminiContent*)param.param1.GetUserData();
Room* room = incubator->room;
int wave = param.param2.GetInt();
int monIdx = param.param3.GetInt();
#ifdef DEBUG
a8::XPrintf("wave i:%d enemys_size:%d\n", {wave, content->enemys.size()});
#endif
if (monIdx < content->enemys.size()) {
int enemy_id = content->enemys[monIdx];
MetaData::Player* hero_meta = MetaMgr::Instance()->GetPlayer(enemy_id);
if (hero_meta) {
a8::Vec2 hero_pos = content->spawn_point;
int team_id = 666;
Creature* master = nullptr;
a8::Vec2 dir = hero_pos;
dir.Normalize();
Hero* hero = room->CreateHero(master,
hero_meta,
hero_pos,
dir,
team_id);
if (!hero) {
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()) {
hero->is_pve_boss = true;
#ifdef DEBGU
a8::XPrintf("pve_boss appear\n", {});
#endif
}
++room->pve_data.mon_num;
room->NotifyUiUpdate();
}
}
};
auto& mons = room->pve_mode_meta->waves[wave];
for (MetaData::PveGeminiContent* content : mons) {
for (int i = 0; i < content->enemys.size(); ++i) {
@ -296,45 +360,9 @@ void Incubator::SpawnWaveMon(int wave)
a8::XParams()
.SetSender(this)
.SetParam1(content)
.SetParam2(room)
.SetParam2(wave)
.SetParam3(i),
[] (const a8::XParams& param)
{
MetaData::PveGeminiContent* content = (MetaData::PveGeminiContent*)param.param1.GetUserData();
Room* room = (Room*)param.param2.GetUserData();
int wave = param.param3.GetInt();
#ifdef DEBUG
a8::XPrintf("wave i:%d enemys_size:%d\n", {wave, content->enemys.size()});
#endif
if (param.param3.GetInt() < content->enemys.size()) {
int enemy_id = content->enemys[param.param3.GetInt()];
MetaData::Player* hero_meta = MetaMgr::Instance()->GetPlayer(enemy_id);
if (hero_meta) {
a8::Vec2 hero_pos = content->spawn_point;
int team_id = 666;
Creature* master = nullptr;
a8::Vec2 dir = hero_pos;
dir.Normalize();
Hero* hero = room->CreateHero(master,
hero_meta,
hero_pos,
dir,
team_id);
if (!hero) {
A8_ABORT();
}
if (wave + 1 == room->pve_mode_meta->waves.size()) {
hero->is_pve_boss = true;
}
++room->pve_data.mon_num;
room->NotifyUiUpdate();
}
}
},
cb,
&xtimer_attacher_.timer_list_);
}
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)
{
room->grid_service->TraverseCreatures(room->GetRoomIdx(),
@ -81,6 +94,19 @@ void MoveableEntity::SetAttackDir(const a8::Vec2& attack_dir)
{
attack_dir_ = attack_dir;
++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()

View File

@ -23,6 +23,7 @@ class MoveableEntity : public RoomEntity
std::set<GridCell*>& dec_grids
);
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 void SetMoveDir(const a8::Vec2& move_dir);
virtual const a8::Vec2& GetAttackDir() { return attack_dir_; };

View File

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

View File

@ -219,6 +219,14 @@ message MFAttrAddition
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
{
@ -486,7 +494,23 @@ message MFActivePlayerData
repeated int32 inventory = 11; //
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 max_energy_shield = 41; //
@ -1129,6 +1153,8 @@ message SMUpdate
optional int32 game_left_time = 45; //(, )
optional int32 frameno = 46;
repeated int32 del_bullets = 47; //
repeated MFCharacterImage image_objects = 50; //-full信息则忽略
}
//