diff --git a/server/gameserver/android.ai.cc b/server/gameserver/android.ai.cc index ce6a220..9fcf947 100644 --- a/server/gameserver/android.ai.cc +++ b/server/gameserver/android.ai.cc @@ -706,6 +706,9 @@ Human* AndroidNewAI::GetTarget() if (a8::HasBitFlag(hum->status, HS_Disable)) { return; } + if (hum->HasBuffEffect(kBET_InGrass)) { + return; + } if (myself->team_id == hum->team_id) { return; } diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index bac9e77..d7f9fd8 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -405,3 +405,7 @@ const int HUNLUAN_BUFFID = 6001; const int DRIVER_BUFFID = 6003; const int PASSENGER_BUFFID = 6004; + +const int GRASS_HIDE_BUFF_ID = 6005; +const int WATER_BUFF_ID = 6006; +const int ICE_BUFF_ID = 6007; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 86e5f87..9e97c9c 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -4335,30 +4335,169 @@ void Human::CheckSpecObject() void Human::OnEnterGrass() { - + if (leave_grass_timer_) { + room->xtimer.DeleteTimer(leave_grass_timer_); + leave_grass_timer_ = nullptr; + } + if (hide_grass_timer_) { + room->xtimer.DeleteTimer(hide_grass_timer_); + hide_grass_timer_ = nullptr; + } + hide_grass_timer_ = room->xtimer.AddDeadLineTimerAndAttach + (MetaMgr::Instance()->grass_invisible_time * SERVER_FRAME_RATE, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(GRASS_HIDE_BUFF_ID); + if (buff_meta) { + hum->AddBuff(hum, buff_meta, 1); + } + }, + &xtimer_attacher.timer_list_, + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->hide_grass_timer_ = nullptr; + }); } void Human::OnLeaveGrass() { - + if (hide_grass_timer_) { + room->xtimer.DeleteTimer(hide_grass_timer_); + hide_grass_timer_ = nullptr; + } + if (leave_grass_timer_) { + room->xtimer.DeleteTimer(leave_grass_timer_); + } + leave_grass_timer_ = room->xtimer.AddDeadLineTimerAndAttach + (MetaMgr::Instance()->grass_show_time * SERVER_FRAME_RATE, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->leave_grass_timer_ = nullptr; + hum->RemoveBuffById(GRASS_HIDE_BUFF_ID); + }, + &xtimer_attacher.timer_list_, + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->leave_grass_timer_ = nullptr; + }); } void Human::OnEnterWater() { - + if (leave_water_timer_) { + room->xtimer.DeleteTimer(leave_water_timer_); + leave_water_timer_ = nullptr; + } + if (hide_water_timer_) { + room->xtimer.DeleteTimer(hide_water_timer_); + hide_water_timer_ = nullptr; + } + hide_water_timer_ = room->xtimer.AddDeadLineTimerAndAttach + (MetaMgr::Instance()->water_invisible_time * SERVER_FRAME_RATE, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(WATER_BUFF_ID); + if (buff_meta) { + hum->AddBuff(hum, buff_meta, 1); + } + }, + &xtimer_attacher.timer_list_, + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->hide_water_timer_ = nullptr; + }); } void Human::OnLeaveWater() { - + if (hide_water_timer_) { + room->xtimer.DeleteTimer(hide_water_timer_); + hide_water_timer_ = nullptr; + } + if (leave_water_timer_) { + room->xtimer.DeleteTimer(leave_water_timer_); + } + leave_water_timer_ = room->xtimer.AddDeadLineTimerAndAttach + (MetaMgr::Instance()->water_show_time * SERVER_FRAME_RATE, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->RemoveBuffById(WATER_BUFF_ID); + }, + &xtimer_attacher.timer_list_, + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->leave_water_timer_ = nullptr; + }); } void Human::OnEnterIce() { - + if (leave_ice_timer_) { + room->xtimer.DeleteTimer(leave_ice_timer_); + leave_ice_timer_ = nullptr; + } + if (hide_ice_timer_) { + room->xtimer.DeleteTimer(hide_ice_timer_); + hide_ice_timer_ = nullptr; + } + hide_ice_timer_ = room->xtimer.AddDeadLineTimerAndAttach + (MetaMgr::Instance()->ice_invisible_time * SERVER_FRAME_RATE, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(ICE_BUFF_ID); + if (buff_meta) { + hum->AddBuff(hum, buff_meta, 1); + } + }, + &xtimer_attacher.timer_list_, + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->hide_ice_timer_ = nullptr; + }); } void Human::OnLeaveIce() { - + if (hide_ice_timer_) { + room->xtimer.DeleteTimer(hide_ice_timer_); + hide_ice_timer_ = nullptr; + } + if (leave_ice_timer_) { + room->xtimer.DeleteTimer(leave_ice_timer_); + } + leave_ice_timer_ = room->xtimer.AddDeadLineTimerAndAttach + (MetaMgr::Instance()->ice_show_time * SERVER_FRAME_RATE, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->RemoveBuffById(ICE_BUFF_ID); + }, + &xtimer_attacher.timer_list_, + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->leave_ice_timer_ = nullptr; + }); } diff --git a/server/gameserver/human.h b/server/gameserver/human.h index e6452b3..79c278f 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -436,6 +436,13 @@ private: Entity* last_collision_door_ = nullptr; long long jump_frameno_ = 0; + xtimer_list* leave_grass_timer_ = nullptr; + xtimer_list* hide_grass_timer_ = nullptr; + xtimer_list* leave_water_timer_ = nullptr; + xtimer_list* hide_water_timer_ = nullptr; + xtimer_list* leave_ice_timer_ = nullptr; + xtimer_list* hide_ice_timer_ = nullptr; + friend class FrameMaker; friend class FrameEvent; }; diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index e3ffdb0..17b7195 100755 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -124,6 +124,16 @@ class MetaMgr : public a8::Singleton int level1room_robot_autodie_distance = 0; std::string level1room_born_point; + float grass_invisible_time = 0.5; + float grass_show_time = 0.5f; + float grass_invisible_time2 = 2.0f; + float water_invisible_time = 0.5; + float water_show_time = 0.5f; + float water_invisible_time2 = 2.0f; + float ice_invisible_time = 0.5; + float ice_show_time = 0.5f; + float ice_invisible_time2 = 2.0f; + #if 0 int refresh_robot_min_num = 0; int refresh_robot_max_num = 0;