diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 0eddd65e..62a77b32 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -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; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index fa52cd56..4a075bdc 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -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, diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index 3501f87b..6d0fac52 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -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) { diff --git a/server/gameserver/mapservice.cc b/server/gameserver/mapservice.cc index 4c47aac6..0834b3e1 100644 --- a/server/gameserver/mapservice.cc +++ b/server/gameserver/mapservice.cc @@ -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); } } diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 9bfcb28b..eebacc32 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -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; }