1
This commit is contained in:
parent
3fe0802f45
commit
ae4a083fe3
@ -333,9 +333,11 @@ enum AIMode_e
|
|||||||
enum ColliderTag_e
|
enum ColliderTag_e
|
||||||
{
|
{
|
||||||
kHalfWallTag = 1,
|
kHalfWallTag = 1,
|
||||||
|
kColliderSpecTag_Begin = 2,
|
||||||
kColliderTag_Grass = 2, //草丛
|
kColliderTag_Grass = 2, //草丛
|
||||||
kColliderTag_Water = 3, //水
|
kColliderTag_Water = 3, //水
|
||||||
kColliderTag_Ice = 4, //冰
|
kColliderTag_Ice = 4, //冰
|
||||||
|
kColliderSpecTag_End = 4,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum GameChannel_e
|
enum GameChannel_e
|
||||||
@ -409,3 +411,5 @@ const int PASSENGER_BUFFID = 6004;
|
|||||||
const int GRASS_HIDE_BUFF_ID = 6005;
|
const int GRASS_HIDE_BUFF_ID = 6005;
|
||||||
const int WATER_BUFF_ID = 6006;
|
const int WATER_BUFF_ID = 6006;
|
||||||
const int ICE_BUFF_ID = 6007;
|
const int ICE_BUFF_ID = 6007;
|
||||||
|
|
||||||
|
const long long SPEC_MAP_OBJECT_FLAGS = A8_DEFINE_RANGE_BIT(long long, kColliderSpecTag_Begin, kColliderSpecTag_End);
|
||||||
|
@ -4284,179 +4284,44 @@ void Human::DoGetOnWithCar(Car* car)
|
|||||||
|
|
||||||
void Human::CheckSpecObject()
|
void Human::CheckSpecObject()
|
||||||
{
|
{
|
||||||
long long spec_flags = 0;
|
|
||||||
a8::SetBitFlag(spec_flags, kColliderTag_Grass);
|
|
||||||
a8::SetBitFlag(spec_flags, kColliderTag_Water);
|
|
||||||
a8::SetBitFlag(spec_flags, kColliderTag_Ice);
|
|
||||||
std::set<ColliderComponent*> colliders;
|
std::set<ColliderComponent*> colliders;
|
||||||
room->map_service->GetSpecColliders(spec_flags, room, GetPos().x, GetPos().y, colliders);
|
room->map_service->GetSpecColliders(SPEC_MAP_OBJECT_FLAGS, room, GetPos().x, GetPos().y, colliders);
|
||||||
|
|
||||||
bool in_grass = false;
|
long long flags = 0;
|
||||||
bool in_water = false;
|
|
||||||
bool in_ice = false;
|
|
||||||
for (const ColliderComponent* collider : colliders) {
|
for (const ColliderComponent* collider : colliders) {
|
||||||
switch (collider->owner->GetEntityType()) {
|
switch (collider->owner->GetEntityType()) {
|
||||||
case ET_Obstacle:
|
case ET_Obstacle:
|
||||||
case ET_Building:
|
case ET_Building:
|
||||||
|
{
|
||||||
|
if (TestCollision(room, (ColliderComponent*)collider)) {
|
||||||
|
flags |= collider->tag;
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_grass) {
|
for (int i = kColliderSpecTag_Begin; i <= kColliderSpecTag_End; ++i) {
|
||||||
if (!HasBuffEffect(kBET_InGrass)) {
|
SpecMapObject& map_obj = spec_map_objects_[i - kColliderSpecTag_Begin];
|
||||||
OnEnterGrass();
|
int buff_effect = 0;
|
||||||
|
if (a8::HasBitFlag(flags, i)) {
|
||||||
|
if (!HasBuffEffect(buff_effect)) {
|
||||||
|
OnEnterSpecMapArea(i, map_obj);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (HasBuffEffect(kBET_InGrass)) {
|
if (HasBuffEffect(buff_effect)) {
|
||||||
OnLeaveGrass();
|
OnLeaveSpecMapArea(i, map_obj);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (in_water) {
|
|
||||||
if (!HasBuffEffect(kBET_InWater)) {
|
|
||||||
OnEnterWater();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (HasBuffEffect(kBET_InWater)) {
|
|
||||||
OnLeaveWater();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (in_ice) {
|
|
||||||
if (!HasBuffEffect(kBET_InIce)) {
|
|
||||||
OnEnterIce();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (HasBuffEffect(kBET_InIce)) {
|
|
||||||
OnLeaveIce();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Human::OnEnterGrass()
|
void Human::OnEnterSpecMapArea(int tag, SpecMapObject& map_obj)
|
||||||
{
|
{
|
||||||
if (leave_grass_timer_) {
|
ClearSpecMapAreaTimer(map_obj);
|
||||||
room->xtimer.DeleteTimer(leave_grass_timer_);
|
map_obj.enter_timer = room->xtimer.AddDeadLineTimerAndAttach
|
||||||
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,
|
(MetaMgr::Instance()->ice_invisible_time * SERVER_FRAME_RATE,
|
||||||
a8::XParams()
|
a8::XParams()
|
||||||
.SetSender(this),
|
.SetSender(this),
|
||||||
@ -4472,20 +4337,13 @@ void Human::OnEnterIce()
|
|||||||
[] (const a8::XParams& param)
|
[] (const a8::XParams& param)
|
||||||
{
|
{
|
||||||
Human* hum = (Human*)param.sender.GetUserData();
|
Human* hum = (Human*)param.sender.GetUserData();
|
||||||
hum->hide_ice_timer_ = nullptr;
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void Human::OnLeaveIce()
|
void Human::OnLeaveSpecMapArea(int tag, SpecMapObject& map_obj)
|
||||||
{
|
{
|
||||||
if (hide_ice_timer_) {
|
ClearSpecMapAreaTimer(map_obj);
|
||||||
room->xtimer.DeleteTimer(hide_ice_timer_);
|
map_obj.leave_timer = room->xtimer.AddDeadLineTimerAndAttach
|
||||||
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,
|
(MetaMgr::Instance()->ice_show_time * SERVER_FRAME_RATE,
|
||||||
a8::XParams()
|
a8::XParams()
|
||||||
.SetSender(this),
|
.SetSender(this),
|
||||||
@ -4498,6 +4356,17 @@ void Human::OnLeaveIce()
|
|||||||
[] (const a8::XParams& param)
|
[] (const a8::XParams& param)
|
||||||
{
|
{
|
||||||
Human* hum = (Human*)param.sender.GetUserData();
|
Human* hum = (Human*)param.sender.GetUserData();
|
||||||
hum->leave_ice_timer_ = nullptr;
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Human::ClearSpecMapAreaTimer(SpecMapObject& map_obj)
|
||||||
|
{
|
||||||
|
if (map_obj.leave_timer) {
|
||||||
|
room->xtimer.DeleteTimer(map_obj.leave_timer);
|
||||||
|
map_obj.leave_timer = nullptr;
|
||||||
|
}
|
||||||
|
if (map_obj.enter_timer) {
|
||||||
|
room->xtimer.DeleteTimer(map_obj.enter_timer);
|
||||||
|
map_obj.enter_timer = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -28,6 +28,12 @@ enum HumanStatus
|
|||||||
HS_End
|
HS_End
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct SpecMapObject
|
||||||
|
{
|
||||||
|
struct xtimer_list* leave_timer = nullptr;
|
||||||
|
struct xtimer_list* enter_timer = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
struct xtimer_list;
|
struct xtimer_list;
|
||||||
class CircleCollider;
|
class CircleCollider;
|
||||||
class AabbCollider;
|
class AabbCollider;
|
||||||
@ -356,12 +362,9 @@ private:
|
|||||||
void DoGetOnWithLoot(Loot* loot_entity);
|
void DoGetOnWithLoot(Loot* loot_entity);
|
||||||
void DoGetOnWithCar(Car* car);
|
void DoGetOnWithCar(Car* car);
|
||||||
void CheckSpecObject();
|
void CheckSpecObject();
|
||||||
void OnEnterGrass();
|
void OnEnterSpecMapArea(int tag, SpecMapObject& map_obj);
|
||||||
void OnLeaveGrass();
|
void OnLeaveSpecMapArea(int tag, SpecMapObject& map_obj);
|
||||||
void OnEnterWater();
|
void ClearSpecMapAreaTimer(SpecMapObject& map_obj);
|
||||||
void OnLeaveWater();
|
|
||||||
void OnEnterIce();
|
|
||||||
void OnLeaveIce();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
int level_ = 0;
|
int level_ = 0;
|
||||||
@ -426,6 +429,7 @@ private:
|
|||||||
std::array<float, kHAT_End> buff_attr_rate_ = {};
|
std::array<float, kHAT_End> buff_attr_rate_ = {};
|
||||||
|
|
||||||
std::array<ObjectSyncFlags, FIXED_OBJECT_MAXID> fixed_object_sync_flags_ = {};
|
std::array<ObjectSyncFlags, FIXED_OBJECT_MAXID> fixed_object_sync_flags_ = {};
|
||||||
|
std::array<SpecMapObject, kColliderSpecTag_End - kColliderSpecTag_Begin + 1> spec_map_objects_ = {};
|
||||||
|
|
||||||
bool already_report_battle_ = false;
|
bool already_report_battle_ = false;
|
||||||
bool sent_battlereport_ = false;
|
bool sent_battlereport_ = false;
|
||||||
@ -436,13 +440,6 @@ private:
|
|||||||
Entity* last_collision_door_ = nullptr;
|
Entity* last_collision_door_ = nullptr;
|
||||||
long long jump_frameno_ = 0;
|
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 FrameMaker;
|
||||||
friend class FrameEvent;
|
friend class FrameEvent;
|
||||||
};
|
};
|
||||||
|
2
third_party/a8engine
vendored
2
third_party/a8engine
vendored
@ -1 +1 @@
|
|||||||
Subproject commit a0d01a57a5792268b7dd0c144dfda00e7e171d80
|
Subproject commit 9f43c10312f3f3adccab2d477365c0c1d9200e03
|
Loading…
x
Reference in New Issue
Block a user