1
This commit is contained in:
commit
c4dcbe431f
@ -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__);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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()) {
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
@ -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()
|
||||
|
@ -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_; };
|
||||
|
@ -63,6 +63,9 @@ void PveData::OnBeKill(Hero* hero)
|
||||
}
|
||||
);
|
||||
pve_kill_boss = true;
|
||||
#ifdef DEBUG
|
||||
a8::XPrintf("onKill pve_boss\n", {});
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
|
@ -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:拳头
|
||||
1:枪1
|
||||
2:枪2
|
||||
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信息则忽略
|
||||
}
|
||||
|
||||
//滚动消息
|
||||
|
Loading…
x
Reference in New Issue
Block a user