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_Fly = 24, //飞行中
kBET_Jump = 25, //跳伞中
kBET_InGrass = 27, //在草丛
kBET_InWater = 28, //在水里
kBET_InIce = 29, //在冰里
kBET_Shield = 31, //护盾
kBET_ThroughWall = 50, //穿墙
kBET_Driver = 51, //驾驶中
kBET_Passenger = 52, //乘座中
kBET_Recoil = 55, //后坐力
kBET_InGrass = 56, //在草丛
kBET_InWater = 57, //在水里
kBET_InIce = 58, //在冰里
kBET_End
};
@ -422,4 +422,7 @@ const int JUMP_BUFFID = 7002;
const int DRIVER_BUFFID = 7003;
const int PASSENGER_BUFFID = 7004;
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) {
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 (!HasBuffEffect(buff_effect)) {
OnEnterSpecMapArea(i, map_obj);
@ -3347,6 +3355,9 @@ void Human::CheckSpecObject()
void Human::OnEnterSpecMapArea(int tag, SpecMapObject& map_obj)
{
#ifdef DEBUG
SendDebugMsg("进入特殊区域");
#endif
ClearSpecMapAreaTimer(map_obj);
map_obj.enter_timer = room->xtimer.AddDeadLineTimerAndAttach
(MetaMgr::Instance()->GetSpecMapAreaEnterTime(tag) * SERVER_FRAME_RATE,
@ -3357,11 +3368,8 @@ void Human::OnEnterSpecMapArea(int tag, SpecMapObject& map_obj)
[] (const a8::XParams& param)
{
Human* hum = (Human*)param.sender.GetUserData();
MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff
(MetaMgr::Instance()->GetSpecMapAreaBuffId(param.param2));
if (buff_meta) {
hum->AddBuff(hum, buff_meta, 1);
}
int buff_id = MetaMgr::Instance()->GetSpecMapAreaBuffId(param.param2);
hum->MustBeAddBuff(hum, buff_id);
},
&xtimer_attacher.timer_list_,
[] (const a8::XParams& param)
@ -3374,6 +3382,9 @@ void Human::OnEnterSpecMapArea(int tag, SpecMapObject& map_obj)
void Human::OnLeaveSpecMapArea(int tag, SpecMapObject& map_obj)
{
#ifdef DEBUG
SendDebugMsg("离开特殊区域");
#endif
ClearSpecMapAreaTimer(map_obj);
map_obj.leave_timer = room->xtimer.AddDeadLineTimerAndAttach
(MetaMgr::Instance()->GetSpecMapAreaLeaveTime(tag) * SERVER_FRAME_RATE,

View File

@ -213,7 +213,10 @@ void MapInstance::CreateTerrain()
MetaData::MapThing* thing_meta = MetaMgr::Instance()->GetMapThing(80001);
#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
if (thing_meta) {
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];
if (grid_val != 0) {
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;
if (dusts.find(grid_val) != dusts.end()) {
a8::SetBitFlag(collider_tag, kColliderTag_Ice);
assert(collider_tag > 0);
} else if (waters.find(grid_val) != waters.end()) {
a8::SetBitFlag(collider_tag, kColliderTag_Water);
assert(collider_tag > 0);
} else if (grasses.find(grid_val) != grasses.end()) {
a8::SetBitFlag(collider_tag, kColliderTag_Grass);
assert(collider_tag > 0);
}
if (collider_tag != 0) {
assert(w < 300 && h < 300);
assert(collider_tag > 0);
InternalCreateObstacle(thing_meta->i->thing_id(), x, y, collider_tag,
[] (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_y = ceil(max_y / cell_width_) - 1;
#endif
if (min_grid_x == -1) {
min_grid_x = 0;
}
if (min_grid_x < 0) {
abort();
}
if (max_grid_x >= map_width_) {
max_grid_x = map_width_ - 1;
}
if (min_grid_y == -1) {
min_grid_y = 0;
}
if (min_grid_y < 0) {
abort();
}
@ -247,7 +253,7 @@ void MapService::GetSpecColliders(long long flags,
}
struct CellNode *node, *tmp;
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);
}
}

View File

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