添加复活机制

This commit is contained in:
aozhiwei 2019-07-05 09:59:26 +08:00
parent 6ee992ae0b
commit 87729ee40e
8 changed files with 64 additions and 112 deletions

View File

@ -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()
{
if (!explosions_.empty()) {
@ -168,4 +183,10 @@ void FrameEvent::Clear()
if (airdrops_.size() > 0) {
airdrops_.Clear();
}
if (!revive_objids_.empty()) {
revive_objids_.clear();
}
if (!dead_objs_.empty()) {
dead_objs_.clear();
}
}

View File

@ -14,6 +14,8 @@ public:
void AddExplosion(Bullet* bullet, int item_id, a8::Vec2 bomb_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 AddDead(Human* sender);
void AddRevive(Human* sender);
void Clear();
private:
@ -23,6 +25,8 @@ private:
std::vector<std::tuple<Human*, ::cs::MFExplosion>> explosions_;
std::vector<std::tuple<Human*, ::cs::MFSmoke>> smokes_;
std::vector<std::tuple<Human*, ::cs::MFEmote>> emotes_;
std::vector<int> revive_objids_;
std::vector<std::tuple<int, int>> dead_objs_;
friend class FrameMaker;
};

View File

@ -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) {
*msg->mutable_airdrop() = room->frame_event.airdrops_.Get(0);
}

View File

@ -543,124 +543,24 @@ void Human::BeKill(int killer_id, const std::string& killer_name, int weapon_id)
{
if (!dead && !room->game_over) {
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_name = killer_name;
stats.weapon_id = weapon_id;
dead = true;
health = 0.0f;
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();
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();
}

View File

@ -200,6 +200,7 @@ private:
void InternalSendGameOver();
void DeadDrop();
void FillSMGameOver(cs::SMGameOver& msg);
void Relive();
protected:
long long last_shot_frameno_ = 0;

View File

@ -105,6 +105,7 @@ public:
MetaMgr::Instance()->kill_param = MetaMgr::Instance()->GetSysParamAsFloat("kill_parameter");
MetaMgr::Instance()->rank_param = MetaMgr::Instance()->GetSysParamAsFloat("rank_parameter");
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) {
abort();
}

View File

@ -42,6 +42,7 @@ class MetaMgr : public a8::Singleton<MetaMgr>
float kill_param = 0.0f;
float rank_param = 0.0f;
int fighting_mode = 0;
int revive_time = 5;
private:
MetaDataLoader* loader_ = nullptr;

View File

@ -81,6 +81,12 @@ message MFPair64
optional int64 value = 2; //val
}
//int32元组
message MFTuple
{
repeated int32 values = 1; //values
}
//
message MFVector2D
{
@ -368,7 +374,7 @@ message MFObjectFull
//()
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_item_id = 6;
optional int32 action_target_id = 7;
@ -718,6 +724,8 @@ message SMUpdate
repeated MFSmoke smokes = 25; //
repeated MFEmote emotes = 23; //
optional MFAirDrop airdrop = 26; //
repeated int32 revive_objids = 27; //
repeated MFTuple dead_objs = 28; //values[0]:objid values[1]:
}
//