This commit is contained in:
aozhiwei 2021-04-01 13:59:21 +08:00
parent a28e2870c2
commit 49a2f32ae5
5 changed files with 43 additions and 16 deletions

View File

@ -145,16 +145,16 @@ enum BuffEffectType_e
kBET_HunLuan = 23, //混乱,在烟雾弹中不自动瞄准 kBET_HunLuan = 23, //混乱,在烟雾弹中不自动瞄准
kBET_Fly = 24, //飞行中 kBET_Fly = 24, //飞行中
kBET_Jump = 25, //跳伞中 kBET_Jump = 25, //跳伞中
kBET_InGrass = 27, //在草丛
kBET_InWater = 28, //在水里
kBET_InIce = 29, //在冰里
kBET_Shield = 31, //护盾 kBET_Shield = 31, //护盾
kBET_ThroughWall = 50, //穿墙 kBET_ThroughWall = 50, //穿墙
kBET_Driver = 51, //驾驶中 kBET_Driver = 51, //驾驶中
kBET_Passenger = 52, //乘座中 kBET_Passenger = 52, //乘座中
kBET_Recoil = 55, //后坐力 kBET_Recoil = 55, //后坐力
kBET_InGrass = 56, //在草丛
kBET_InWater = 57, //在水里
kBET_InIce = 58, //在冰里
kBET_End kBET_End
}; };
@ -422,4 +422,7 @@ const int JUMP_BUFFID = 7002;
const int DRIVER_BUFFID = 7003; const int DRIVER_BUFFID = 7003;
const int PASSENGER_BUFFID = 7004; const int PASSENGER_BUFFID = 7004;
const int kRecoilBuffId = 7005; const int kRecoilBuffId = 7005;
const int kInGrassBuffId = 7006;
const int kInWaterBuffId = 7007;
const int kInIceBuffId = 7008;

View File

@ -3330,9 +3330,17 @@ void Human::CheckSpecObject()
} }
} }
static const int spec_tag_array[kColliderSpecTag_End + 1] =
{
0,
0,
kBET_InGrass, //kColliderTag_Grass
kBET_InWater, //kColliderTag_Water
kBET_InIce //kColliderTag_Ice
};
for (int i = kColliderSpecTag_Begin; i <= kColliderSpecTag_End; ++i) { for (int i = kColliderSpecTag_Begin; i <= kColliderSpecTag_End; ++i) {
SpecMapObject& map_obj = spec_map_objects_[i - kColliderSpecTag_Begin]; SpecMapObject& map_obj = spec_map_objects_[i - kColliderSpecTag_Begin];
int buff_effect = 0; int buff_effect = spec_tag_array[i];
if (a8::HasBitFlag(flags, i)) { if (a8::HasBitFlag(flags, i)) {
if (!HasBuffEffect(buff_effect)) { if (!HasBuffEffect(buff_effect)) {
OnEnterSpecMapArea(i, map_obj); OnEnterSpecMapArea(i, map_obj);
@ -3347,6 +3355,9 @@ void Human::CheckSpecObject()
void Human::OnEnterSpecMapArea(int tag, SpecMapObject& map_obj) void Human::OnEnterSpecMapArea(int tag, SpecMapObject& map_obj)
{ {
#ifdef DEBUG
SendDebugMsg("进入特殊区域");
#endif
ClearSpecMapAreaTimer(map_obj); ClearSpecMapAreaTimer(map_obj);
map_obj.enter_timer = room->xtimer.AddDeadLineTimerAndAttach map_obj.enter_timer = room->xtimer.AddDeadLineTimerAndAttach
(MetaMgr::Instance()->GetSpecMapAreaEnterTime(tag) * SERVER_FRAME_RATE, (MetaMgr::Instance()->GetSpecMapAreaEnterTime(tag) * SERVER_FRAME_RATE,
@ -3357,11 +3368,8 @@ void Human::OnEnterSpecMapArea(int tag, SpecMapObject& map_obj)
[] (const a8::XParams& param) [] (const a8::XParams& param)
{ {
Human* hum = (Human*)param.sender.GetUserData(); Human* hum = (Human*)param.sender.GetUserData();
MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff int buff_id = MetaMgr::Instance()->GetSpecMapAreaBuffId(param.param2);
(MetaMgr::Instance()->GetSpecMapAreaBuffId(param.param2)); hum->MustBeAddBuff(hum, buff_id);
if (buff_meta) {
hum->AddBuff(hum, buff_meta, 1);
}
}, },
&xtimer_attacher.timer_list_, &xtimer_attacher.timer_list_,
[] (const a8::XParams& param) [] (const a8::XParams& param)
@ -3374,6 +3382,9 @@ void Human::OnEnterSpecMapArea(int tag, SpecMapObject& map_obj)
void Human::OnLeaveSpecMapArea(int tag, SpecMapObject& map_obj) void Human::OnLeaveSpecMapArea(int tag, SpecMapObject& map_obj)
{ {
#ifdef DEBUG
SendDebugMsg("离开特殊区域");
#endif
ClearSpecMapAreaTimer(map_obj); ClearSpecMapAreaTimer(map_obj);
map_obj.leave_timer = room->xtimer.AddDeadLineTimerAndAttach map_obj.leave_timer = room->xtimer.AddDeadLineTimerAndAttach
(MetaMgr::Instance()->GetSpecMapAreaLeaveTime(tag) * SERVER_FRAME_RATE, (MetaMgr::Instance()->GetSpecMapAreaLeaveTime(tag) * SERVER_FRAME_RATE,

View File

@ -213,7 +213,10 @@ void MapInstance::CreateTerrain()
MetaData::MapThing* thing_meta = MetaMgr::Instance()->GetMapThing(80001); MetaData::MapThing* thing_meta = MetaMgr::Instance()->GetMapThing(80001);
#ifdef DEBUG #ifdef DEBUG
a8::XPrintf("%s %f %f\n", {map_tpl_name_, (float)first_layer->width(), (float)first_layer->height()}); a8::XPrintf("%s %s %f %f\n", {map_tpl_name_,
map_meta_->i->map_pic(),
(float)first_layer->width(),
(float)first_layer->height()});
#endif #endif
if (thing_meta) { if (thing_meta) {
for (int w = 0; w < first_layer->width(); ++w) { for (int w = 0; w < first_layer->width(); ++w) {
@ -222,17 +225,21 @@ void MapInstance::CreateTerrain()
int grid_val = grids[w * first_layer->width() + h]; int grid_val = grids[w * first_layer->width() + h];
if (grid_val != 0) { if (grid_val != 0) {
float x = w * thing_meta->i->width() + thing_meta->i->width() / 2.0f; float x = w * thing_meta->i->width() + thing_meta->i->width() / 2.0f;
float y = h * thing_meta->i->height() + thing_meta->i->height() / 2.0f; float y = (first_layer->height() * thing_meta->i->height()) - (h * thing_meta->i->height() + thing_meta->i->height() / 2.0f);
int collider_tag = 0; int collider_tag = 0;
if (dusts.find(grid_val) != dusts.end()) { if (dusts.find(grid_val) != dusts.end()) {
a8::SetBitFlag(collider_tag, kColliderTag_Ice); a8::SetBitFlag(collider_tag, kColliderTag_Ice);
assert(collider_tag > 0);
} else if (waters.find(grid_val) != waters.end()) { } else if (waters.find(grid_val) != waters.end()) {
a8::SetBitFlag(collider_tag, kColliderTag_Water); a8::SetBitFlag(collider_tag, kColliderTag_Water);
assert(collider_tag > 0);
} else if (grasses.find(grid_val) != grasses.end()) { } else if (grasses.find(grid_val) != grasses.end()) {
a8::SetBitFlag(collider_tag, kColliderTag_Grass); a8::SetBitFlag(collider_tag, kColliderTag_Grass);
assert(collider_tag > 0);
} }
if (collider_tag != 0) { if (collider_tag != 0) {
assert(w < 300 && h < 300); assert(w < 300 && h < 300);
assert(collider_tag > 0);
InternalCreateObstacle(thing_meta->i->thing_id(), x, y, collider_tag, InternalCreateObstacle(thing_meta->i->thing_id(), x, y, collider_tag,
[] (Obstacle* entity) [] (Obstacle* entity)
{ {

View File

@ -108,12 +108,18 @@ void MapService::AddCollider(ColliderComponent* collider)
int max_grid_x = ceil(max_x / cell_width_) - 1; int max_grid_x = ceil(max_x / cell_width_) - 1;
int max_grid_y = ceil(max_y / cell_width_) - 1; int max_grid_y = ceil(max_y / cell_width_) - 1;
#endif #endif
if (min_grid_x == -1) {
min_grid_x = 0;
}
if (min_grid_x < 0) { if (min_grid_x < 0) {
abort(); abort();
} }
if (max_grid_x >= map_width_) { if (max_grid_x >= map_width_) {
max_grid_x = map_width_ - 1; max_grid_x = map_width_ - 1;
} }
if (min_grid_y == -1) {
min_grid_y = 0;
}
if (min_grid_y < 0) { if (min_grid_y < 0) {
abort(); abort();
} }
@ -247,7 +253,7 @@ void MapService::GetSpecColliders(long long flags,
} }
struct CellNode *node, *tmp; struct CellNode *node, *tmp;
list_for_each_entry_safe(node, tmp, head, entry) { list_for_each_entry_safe(node, tmp, head, entry) {
if (a8::HasBitFlag(flags, node->collider->tag)) { if ((flags & (long long)node->collider->tag) != 0) {
colliders.insert(node->collider); colliders.insert(node->collider);
} }
} }

View File

@ -913,11 +913,11 @@ int MetaMgr::GetSpecMapAreaBuffId(int tag)
{ {
switch (tag) { switch (tag) {
case kColliderTag_Grass: case kColliderTag_Grass:
return 6005; return kInGrassBuffId;
case kColliderTag_Water: case kColliderTag_Water:
return 6006; return kInWaterBuffId;
case kColliderTag_Ice: case kColliderTag_Ice:
return 6007; return kInIceBuffId;
default: default:
return 0; return 0;
} }