添加复活机制
This commit is contained in:
parent
6ee992ae0b
commit
87729ee40e
@ -148,6 +148,21 @@ void FrameEvent::AddSmoke(Bullet* bullet, int item_id, a8::Vec2 pos)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FrameEvent::AddDead(Human* sender)
|
||||||
|
{
|
||||||
|
dead_objs_.push_back(
|
||||||
|
std::make_tuple(
|
||||||
|
sender->entity_uniid,
|
||||||
|
MetaMgr::Instance()->revive_time * 1000
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FrameEvent::AddRevive(Human* sender)
|
||||||
|
{
|
||||||
|
revive_objids_.push_back(sender->entity_uniid);
|
||||||
|
}
|
||||||
|
|
||||||
void FrameEvent::Clear()
|
void FrameEvent::Clear()
|
||||||
{
|
{
|
||||||
if (!explosions_.empty()) {
|
if (!explosions_.empty()) {
|
||||||
@ -168,4 +183,10 @@ void FrameEvent::Clear()
|
|||||||
if (airdrops_.size() > 0) {
|
if (airdrops_.size() > 0) {
|
||||||
airdrops_.Clear();
|
airdrops_.Clear();
|
||||||
}
|
}
|
||||||
|
if (!revive_objids_.empty()) {
|
||||||
|
revive_objids_.clear();
|
||||||
|
}
|
||||||
|
if (!dead_objs_.empty()) {
|
||||||
|
dead_objs_.clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,8 @@ public:
|
|||||||
void AddExplosion(Bullet* bullet, int item_id, a8::Vec2 bomb_pos);
|
void AddExplosion(Bullet* bullet, int item_id, a8::Vec2 bomb_pos);
|
||||||
void AddSmoke(Bullet* bullet, int item_id, a8::Vec2 pos);
|
void AddSmoke(Bullet* bullet, int item_id, a8::Vec2 pos);
|
||||||
void AddExplosionEx(Human* sender, int item_id, a8::Vec2 bomb_pos, int effect);
|
void AddExplosionEx(Human* sender, int item_id, a8::Vec2 bomb_pos, int effect);
|
||||||
|
void AddDead(Human* sender);
|
||||||
|
void AddRevive(Human* sender);
|
||||||
|
|
||||||
void Clear();
|
void Clear();
|
||||||
private:
|
private:
|
||||||
@ -23,6 +25,8 @@ private:
|
|||||||
std::vector<std::tuple<Human*, ::cs::MFExplosion>> explosions_;
|
std::vector<std::tuple<Human*, ::cs::MFExplosion>> explosions_;
|
||||||
std::vector<std::tuple<Human*, ::cs::MFSmoke>> smokes_;
|
std::vector<std::tuple<Human*, ::cs::MFSmoke>> smokes_;
|
||||||
std::vector<std::tuple<Human*, ::cs::MFEmote>> emotes_;
|
std::vector<std::tuple<Human*, ::cs::MFEmote>> emotes_;
|
||||||
|
std::vector<int> revive_objids_;
|
||||||
|
std::vector<std::tuple<int, int>> dead_objs_;
|
||||||
|
|
||||||
friend class FrameMaker;
|
friend class FrameMaker;
|
||||||
};
|
};
|
||||||
|
@ -62,6 +62,14 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(const Human* hum)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (int objid : room->frame_event.revive_objids_) {
|
||||||
|
msg->add_revive_objids(objid);
|
||||||
|
}
|
||||||
|
for (auto& tuple : room->frame_event.dead_objs_) {
|
||||||
|
auto p = msg->add_dead_objs();
|
||||||
|
p->add_values(std::get<0>(tuple));
|
||||||
|
p->add_values(std::get<1>(tuple));
|
||||||
|
}
|
||||||
if (room->frame_event.airdrops_.size() > 0) {
|
if (room->frame_event.airdrops_.size() > 0) {
|
||||||
*msg->mutable_airdrop() = room->frame_event.airdrops_.Get(0);
|
*msg->mutable_airdrop() = room->frame_event.airdrops_.Get(0);
|
||||||
}
|
}
|
||||||
|
@ -543,124 +543,24 @@ void Human::BeKill(int killer_id, const std::string& killer_name, int weapon_id)
|
|||||||
{
|
{
|
||||||
if (!dead && !room->game_over) {
|
if (!dead && !room->game_over) {
|
||||||
lethal_weapon = weapon_id;
|
lethal_weapon = weapon_id;
|
||||||
Entity* hum = room->GetEntityByUniId(killer_id);
|
|
||||||
if (hum && hum->entity_type == ET_Player) {
|
|
||||||
if (killer_id == entity_uniid) {
|
|
||||||
std::string msg = a8::Format("%s 自杀",
|
|
||||||
{
|
|
||||||
killer_name,
|
|
||||||
});
|
|
||||||
SendRollMsg(msg);
|
|
||||||
} else {
|
|
||||||
((Human*)hum)->stats.kills++;
|
|
||||||
((Human*)hum)->kill_humans.insert(this);
|
|
||||||
MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(weapon_id);
|
|
||||||
if (equip_meta) {
|
|
||||||
std::string msg = a8::Format("%s 使用 %s 干掉了 %s",
|
|
||||||
{
|
|
||||||
killer_name,
|
|
||||||
equip_meta->i->name(),
|
|
||||||
name
|
|
||||||
});
|
|
||||||
SendRollMsg(msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
switch (weapon_id) {
|
|
||||||
case VW_SafeArea:
|
|
||||||
{
|
|
||||||
std::string msg = a8::Format("%s 被毒圈干掉",
|
|
||||||
{
|
|
||||||
name
|
|
||||||
});
|
|
||||||
SendRollMsg(msg);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case VW_Spectate:
|
|
||||||
{
|
|
||||||
std::string msg = a8::Format("%s 自杀",
|
|
||||||
{
|
|
||||||
name
|
|
||||||
});
|
|
||||||
SendRollMsg(msg);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case VW_SelfDetonate:
|
|
||||||
{
|
|
||||||
std::string msg = a8::Format("%s 被炸死",
|
|
||||||
{
|
|
||||||
name
|
|
||||||
});
|
|
||||||
SendRollMsg(msg);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case VW_Mine:
|
|
||||||
{
|
|
||||||
std::string msg = a8::Format("%s 被地雷炸死",
|
|
||||||
{
|
|
||||||
name
|
|
||||||
});
|
|
||||||
SendRollMsg(msg);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stats.killer_id = killer_id;
|
stats.killer_id = killer_id;
|
||||||
stats.killer_name = killer_name;
|
stats.killer_name = killer_name;
|
||||||
stats.weapon_id = weapon_id;
|
stats.weapon_id = weapon_id;
|
||||||
dead = true;
|
dead = true;
|
||||||
health = 0.0f;
|
health = 0.0f;
|
||||||
dead_frameno = room->frame_no;
|
dead_frameno = room->frame_no;
|
||||||
room->OnHumanDie(this);
|
room->xtimer.AddDeadLineTimerAndAttach(MetaMgr::Instance()->revive_time * SERVER_FRAME_RATE,
|
||||||
|
a8::XParams()
|
||||||
|
.SetSender(this),
|
||||||
|
[] (const a8::XParams& param)
|
||||||
|
{
|
||||||
|
Human* hum = (Human*)param.sender.GetUserData();
|
||||||
|
hum->Relive();
|
||||||
|
},
|
||||||
|
&xtimer_attacher.timer_list_
|
||||||
|
);
|
||||||
|
room->frame_event.AddDead(this);
|
||||||
SyncAroundPlayers();
|
SyncAroundPlayers();
|
||||||
if (team_members) {
|
|
||||||
for (auto& hum : *team_members) {
|
|
||||||
if (hum != this && hum->action_type == AT_Relive &&
|
|
||||||
hum->action_target_id == entity_uniid) {
|
|
||||||
hum->CancelAction();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!HasNoDownedTeammate() && !leave_) {
|
|
||||||
if (team_members) {
|
|
||||||
for (auto& member : *team_members) {
|
|
||||||
if (member == this) {
|
|
||||||
member->SendGameOver();
|
|
||||||
} else {
|
|
||||||
if (member->dead) {
|
|
||||||
member->SendGameOver();
|
|
||||||
} else if (member->downed) {
|
|
||||||
a8::XParams& timer_param = room->xtimer.GetTimerXParams(member->downed_timer);
|
|
||||||
member->stats.killer_id = timer_param.param1;
|
|
||||||
member->stats.killer_name = timer_param.param2.GetString();
|
|
||||||
member->stats.weapon_id = timer_param.param2;
|
|
||||||
member->dead = true;
|
|
||||||
member->health = 0.0f;
|
|
||||||
member->dead_frameno = room->frame_no;
|
|
||||||
member->room->OnHumanDie(this);
|
|
||||||
member->SyncAroundPlayers();
|
|
||||||
member->SendGameOver();
|
|
||||||
room->xtimer.DeleteTimer(member->downed_timer);
|
|
||||||
member->downed_timer = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
SendGameOver();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (room->GetAliveTeamNum() == 1) {
|
|
||||||
std::set<Human*>* alive_team = room->GetAliveTeam();
|
|
||||||
if (team_members != alive_team) {
|
|
||||||
SendGameOver();
|
|
||||||
}
|
|
||||||
if (alive_team) {
|
|
||||||
for (Human* member : *alive_team) {
|
|
||||||
member->SendGameOver();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
DeadDrop();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1941,3 +1841,11 @@ void Human::DeadDrop()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Human::Relive()
|
||||||
|
{
|
||||||
|
dead = false;
|
||||||
|
health = GetMaxHP();
|
||||||
|
room->frame_event.AddRevive(this);
|
||||||
|
SyncAroundPlayers();
|
||||||
|
}
|
||||||
|
@ -200,6 +200,7 @@ private:
|
|||||||
void InternalSendGameOver();
|
void InternalSendGameOver();
|
||||||
void DeadDrop();
|
void DeadDrop();
|
||||||
void FillSMGameOver(cs::SMGameOver& msg);
|
void FillSMGameOver(cs::SMGameOver& msg);
|
||||||
|
void Relive();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
long long last_shot_frameno_ = 0;
|
long long last_shot_frameno_ = 0;
|
||||||
|
@ -105,6 +105,7 @@ public:
|
|||||||
MetaMgr::Instance()->kill_param = MetaMgr::Instance()->GetSysParamAsFloat("kill_parameter");
|
MetaMgr::Instance()->kill_param = MetaMgr::Instance()->GetSysParamAsFloat("kill_parameter");
|
||||||
MetaMgr::Instance()->rank_param = MetaMgr::Instance()->GetSysParamAsFloat("rank_parameter");
|
MetaMgr::Instance()->rank_param = MetaMgr::Instance()->GetSysParamAsFloat("rank_parameter");
|
||||||
MetaMgr::Instance()->fighting_mode = MetaMgr::Instance()->GetSysParamAsInt("fighting_mode", 1);
|
MetaMgr::Instance()->fighting_mode = MetaMgr::Instance()->GetSysParamAsInt("fighting_mode", 1);
|
||||||
|
MetaMgr::Instance()->revive_time = MetaMgr::Instance()->GetSysParamAsInt("revive_time", 5);
|
||||||
if (MetaMgr::Instance()->K < 0.01f) {
|
if (MetaMgr::Instance()->K < 0.01f) {
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
@ -42,6 +42,7 @@ class MetaMgr : public a8::Singleton<MetaMgr>
|
|||||||
float kill_param = 0.0f;
|
float kill_param = 0.0f;
|
||||||
float rank_param = 0.0f;
|
float rank_param = 0.0f;
|
||||||
int fighting_mode = 0;
|
int fighting_mode = 0;
|
||||||
|
int revive_time = 5;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MetaDataLoader* loader_ = nullptr;
|
MetaDataLoader* loader_ = nullptr;
|
||||||
|
@ -81,6 +81,12 @@ message MFPair64
|
|||||||
optional int64 value = 2; //val
|
optional int64 value = 2; //val
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//int32元组
|
||||||
|
message MFTuple
|
||||||
|
{
|
||||||
|
repeated int32 values = 1; //values
|
||||||
|
}
|
||||||
|
|
||||||
//向量
|
//向量
|
||||||
message MFVector2D
|
message MFVector2D
|
||||||
{
|
{
|
||||||
@ -368,7 +374,7 @@ message MFObjectFull
|
|||||||
//活跃玩家数据(当前)
|
//活跃玩家数据(当前)
|
||||||
message MFActivePlayerData
|
message MFActivePlayerData
|
||||||
{
|
{
|
||||||
optional int32 action_type = 3; //0: none 1:reload 2:useitem 3:relive 4: rescue
|
optional int32 action_type = 3; //0: none 1:reload 2:useitem 3:revive 4: rescue
|
||||||
optional int32 action_duration = 5; //持续时间毫秒
|
optional int32 action_duration = 5; //持续时间毫秒
|
||||||
optional int32 action_item_id = 6;
|
optional int32 action_item_id = 6;
|
||||||
optional int32 action_target_id = 7;
|
optional int32 action_target_id = 7;
|
||||||
@ -718,6 +724,8 @@ message SMUpdate
|
|||||||
repeated MFSmoke smokes = 25; //烟雾
|
repeated MFSmoke smokes = 25; //烟雾
|
||||||
repeated MFEmote emotes = 23; //表情
|
repeated MFEmote emotes = 23; //表情
|
||||||
optional MFAirDrop airdrop = 26; //空投
|
optional MFAirDrop airdrop = 26; //空投
|
||||||
|
repeated int32 revive_objids = 27; //复活的玩家
|
||||||
|
repeated MFTuple dead_objs = 28; //死亡的玩家values[0]:objid values[1]:多少毫秒后复活
|
||||||
}
|
}
|
||||||
|
|
||||||
//滚动消息
|
//滚动消息
|
||||||
|
Loading…
x
Reference in New Issue
Block a user