添加潜水功能
This commit is contained in:
parent
da8626a1e4
commit
2d78f7599b
@ -743,3 +743,52 @@ void Buff::CalcPassengerShotOffset()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Buff::ProcDive()
|
||||
{
|
||||
if (owner->IsHuman()) {
|
||||
owner->AsHuman()->SetOxygen(MetaMgr::Instance()->dive_oxygen_total);
|
||||
owner->AsHuman()->room->frame_event.AddPropChg
|
||||
(owner->AsHuman()->GetWeakPtrRef(),
|
||||
kPropDive,
|
||||
MetaMgr::Instance()->dive_oxygen_total,
|
||||
owner->AsHuman()->GetOxygen(),
|
||||
true);
|
||||
}
|
||||
owner->room->xtimer.AddRepeatTimerAndAttach
|
||||
(
|
||||
SERVER_FRAME_RATE,
|
||||
a8::XParams()
|
||||
.SetSender(this),
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
Buff* buff = (Buff*)param.sender.GetUserData();
|
||||
if (buff->owner->dead || !buff->owner->IsHuman()) {
|
||||
buff->owner->RemoveBuffByUniId(buff->buff_uniid);
|
||||
return;
|
||||
}
|
||||
Human* hum = buff->owner->AsHuman();
|
||||
if (hum->GetOxygen() > 0) {
|
||||
hum->DecOxygen(MetaMgr::Instance()->dive_oxygen_consume);
|
||||
hum->room->frame_event.AddPropChg(hum->GetWeakPtrRef(),
|
||||
kPropDive,
|
||||
MetaMgr::Instance()->dive_oxygen_total,
|
||||
hum->GetOxygen(),
|
||||
true);
|
||||
return;
|
||||
}
|
||||
hum->DecHP(MetaMgr::Instance()->dive_hp_consume,
|
||||
VP_Water,
|
||||
"水",
|
||||
0);
|
||||
},
|
||||
&xtimer_attacher.timer_list_
|
||||
);
|
||||
}
|
||||
|
||||
void Buff::ProcRemoveDive()
|
||||
{
|
||||
if (owner->IsHuman()) {
|
||||
owner->AsHuman()->SetOxygen(0);
|
||||
}
|
||||
}
|
||||
|
@ -73,6 +73,8 @@ class Buff
|
||||
void ProcAutoShot();
|
||||
void ProcBeatBack();
|
||||
void ProcDisperse();
|
||||
void ProcDive();
|
||||
void ProcRemoveDive();
|
||||
|
||||
void CalcPassengerShotOffset();
|
||||
|
||||
|
@ -219,6 +219,7 @@ enum VirtualPlayer_e
|
||||
VP_Gas = 9000000,
|
||||
VP_Buff = 9000001,
|
||||
VP_Explosion = 9000002,
|
||||
VP_Water = 9000003,
|
||||
};
|
||||
|
||||
enum EquipType_e
|
||||
@ -264,6 +265,7 @@ enum PropertyType_e
|
||||
kPropSkillMaxTimes = 26,
|
||||
kPropCarOil = 27,
|
||||
kPropFollowTarget = 30,
|
||||
kPropDive = 31,
|
||||
};
|
||||
|
||||
enum MapObjectType_e
|
||||
|
@ -18,6 +18,7 @@ const int kRescueBuffId = 7017;
|
||||
const int kVertigoBuffId = 7018;
|
||||
const int kPeaceModeBuffId = 7019;
|
||||
const int kPullToWalkableBuffId = 8003;
|
||||
const int kDiveBuffId = 8054;
|
||||
|
||||
enum BuffEffectType_e
|
||||
{
|
||||
@ -94,6 +95,7 @@ enum BuffEffectType_e
|
||||
kBET_PeaceMode = 69, //和平模式
|
||||
kBET_ClientUse1 = 70, //
|
||||
kBET_ClientUse2 = 71, //
|
||||
kBET_Dive = 72, //下潜模式
|
||||
|
||||
kBET_End
|
||||
};
|
||||
|
@ -1386,6 +1386,11 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff)
|
||||
{
|
||||
}
|
||||
break;
|
||||
case kBET_Dive:
|
||||
{
|
||||
buff->ProcDive();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
}
|
||||
|
@ -1187,6 +1187,10 @@ void Human::FillMFActivePlayerData(cs::MFActivePlayerData* player_data)
|
||||
player_data->set_max_health(GetMaxHP());
|
||||
player_data->set_cur_weapon_idx(GetCurrWeapon()->weapon_idx);
|
||||
player_data->set_cur_scope(curr_scope_idx);
|
||||
if (HasBuffEffect(kBET_Dive)) {
|
||||
player_data->set_dive_oxygen_max(MetaMgr::Instance()->dive_oxygen_total);
|
||||
player_data->set_dive_oxygen_curr(oxygen_);
|
||||
}
|
||||
for (auto& weapon : weapons) {
|
||||
auto p = player_data->add_weapons();
|
||||
weapon.ToPB(p);
|
||||
@ -2878,6 +2882,11 @@ void Human::OnBuffRemove(Buff& buff)
|
||||
buff.ProcRemovePassenger();
|
||||
}
|
||||
break;
|
||||
case kBET_Dive:
|
||||
{
|
||||
buff.ProcRemoveDive();
|
||||
}
|
||||
break;
|
||||
case kBET_AddInventory:
|
||||
{
|
||||
for (int slot : buff.meta->param2_int_list) {
|
||||
@ -3804,6 +3813,20 @@ void Human::DoFollow(int target_id)
|
||||
IncFollowTimes();
|
||||
}
|
||||
|
||||
void Human::DoDive()
|
||||
{
|
||||
if (!HasBuffEffect(kBET_InWater)) {
|
||||
return;
|
||||
}
|
||||
if (HasBuffEffect(kBET_Dive)) {
|
||||
return;
|
||||
}
|
||||
if (HasBuffEffect(kBET_Camouflage) ) {
|
||||
RemoveBuffByEffectId(kBET_Camouflage);
|
||||
}
|
||||
MustBeAddBuff(this, kDiveBuffId);
|
||||
}
|
||||
|
||||
void Human::OnWatcherDie(Human* watcher)
|
||||
{
|
||||
if (follow_target_ == watcher) {
|
||||
@ -3827,3 +3850,9 @@ void Human::TraverseObservers(std::function<void (Human*, bool&)> func)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Human::DecOxygen(int val)
|
||||
{
|
||||
oxygen_ -= val;
|
||||
oxygen_ = std::max(0, oxygen_);
|
||||
}
|
||||
|
@ -264,8 +264,12 @@ class Human : public Creature
|
||||
void ProcUseItem(int item_id);
|
||||
void StartRefreshViewTimer();
|
||||
void DoFollow(int target_id);
|
||||
void DoDive();
|
||||
void OnWatcherDie(Human* watcher);
|
||||
FrameData& GetFrameData() { return framedata_; };
|
||||
int GetOxygen() { return oxygen_; };
|
||||
void SetOxygen(int oxygen) { oxygen_ = oxygen; };
|
||||
void DecOxygen(int val);
|
||||
|
||||
protected:
|
||||
void _InternalUpdateMove(float speed);
|
||||
@ -325,6 +329,7 @@ protected:
|
||||
long long last_sync_teamdata_frameno_ = 0;
|
||||
bool leave_ = false;
|
||||
long long leave_frameno_ = 0;
|
||||
int oxygen_ = 0;
|
||||
|
||||
std::array<int, IS_END> volume_ = {};
|
||||
Human* follow_target_ = nullptr;
|
||||
|
@ -112,7 +112,14 @@ void KillMgr::FillHintInfo(Human* dead_hum, KillInfo* info, RollMsgHintInfo& hin
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
case VP_Water:
|
||||
{
|
||||
hint_info.killer_name = "";
|
||||
hint_info.hint_template = MetaMgr::Instance()->GetTextElements
|
||||
("battle_server_dead_text_drown");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
Entity* killer = dead_hum->room->GetEntityByUniId(info->killer_id);
|
||||
if (killer) {
|
||||
|
@ -514,6 +514,10 @@ public:
|
||||
METAMGR_READ(level1room_robot_autodie_distance, 500);
|
||||
METAMGR_READ_STR(level1room_born_point, "");
|
||||
|
||||
METAMGR_READ(dive_oxygen_total, 200);
|
||||
METAMGR_READ(dive_oxygen_consume, 20);
|
||||
METAMGR_READ(dive_hp_consume, 20);
|
||||
METAMGR_READ(dive_explosion_dmg_switch, 0);
|
||||
}
|
||||
if (MetaMgr::Instance()->K < 0.01f) {
|
||||
abort();
|
||||
|
@ -183,6 +183,11 @@ class MetaMgr : public a8::Singleton<MetaMgr>
|
||||
int match_choose_time = 0;
|
||||
int match_lock_time = 0;
|
||||
|
||||
int dive_oxygen_total = 0;
|
||||
int dive_oxygen_consume = 0;
|
||||
int dive_hp_consume = 0;
|
||||
int dive_explosion_dmg_switch = 0;
|
||||
|
||||
private:
|
||||
MetaDataLoader* loader_ = nullptr;
|
||||
|
||||
|
@ -122,6 +122,9 @@ void Player::InternalUpdate(int delta_time)
|
||||
if (follow != -1) {
|
||||
UpdateFollow();
|
||||
}
|
||||
if (dive) {
|
||||
UpdateDive();
|
||||
}
|
||||
if (shot_start || shot_hold) {
|
||||
UpdateShot();
|
||||
}
|
||||
@ -797,6 +800,9 @@ void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg)
|
||||
if (msg.has_follow()) {
|
||||
follow = msg.follow();
|
||||
}
|
||||
if (msg.has_dive()) {
|
||||
dive = msg.dive();
|
||||
}
|
||||
if (msg.has_use_skill()) {
|
||||
use_skill = msg.use_skill();
|
||||
use_skill_id = msg.skill_id();
|
||||
@ -1321,6 +1327,12 @@ void Player::UpdateFollow()
|
||||
follow = -1;
|
||||
}
|
||||
|
||||
void Player::UpdateDive()
|
||||
{
|
||||
DoDive();
|
||||
dive = 0;
|
||||
}
|
||||
|
||||
void Player::CheckShotHoldState(Weapon* weapon)
|
||||
{
|
||||
if (weapon->meta->buff_meta && weapon->meta->buff_meta->i->trigger_type() == kBTT_SeriesShot) {
|
||||
|
@ -69,6 +69,7 @@ class Player : public Human
|
||||
int switch_seat = 0;
|
||||
|
||||
int follow = -1;
|
||||
int dive = 0;
|
||||
|
||||
::google::protobuf::RepeatedField< ::google::protobuf::int32 > interaction_objids;
|
||||
|
||||
@ -93,6 +94,7 @@ class Player : public Human
|
||||
void UpdateUseSkill();
|
||||
void UpdateAiming();
|
||||
void UpdateFollow();
|
||||
void UpdateDive();
|
||||
void Shot();
|
||||
void ProcInteraction();
|
||||
void ObstacleInteraction(Obstacle* entity);
|
||||
|
@ -143,6 +143,9 @@ message MFVec2
|
||||
valule: 百分比绝对值
|
||||
property_type: 30 跟随目标id
|
||||
valule: 目标id
|
||||
property_type: 31 下潜后氧气
|
||||
property_subtype: 总量
|
||||
valule: 当前量
|
||||
*/
|
||||
message MFPropertyChg
|
||||
{
|
||||
@ -595,6 +598,9 @@ message MFActivePlayerData
|
||||
|
||||
optional float shoot_offset_x = 50 [default = 0]; //射击偏移量-x
|
||||
optional float shoot_offset_y = 51 [default = 0]; //射击偏移量-y
|
||||
|
||||
optional int32 dive_oxygen_max = 63; //下潜时氧气总量
|
||||
optional int32 dive_oxygen_curr = 64; //下潜时氧气当前量
|
||||
}
|
||||
|
||||
//毒圈数据
|
||||
@ -1016,6 +1022,8 @@ message CMMove
|
||||
optional int32 switch_seat = 37; //切换座位
|
||||
|
||||
optional int32 follow = 38; //跟随0:取消跟随 其他:玩家uniid
|
||||
|
||||
optional int32 dive = 39; //下潜
|
||||
}
|
||||
|
||||
//执行GM指令
|
||||
|
Loading…
x
Reference in New Issue
Block a user