diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index 40a19dc..25aa794 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -170,6 +170,17 @@ namespace MetaData a8::SetBitFlag(receive_special_damage_type, n); } } + { + std::vector strings; + a8::Split(i->sweep_tags(), strings, '|'); + for (auto& str : strings) { + int n = a8::XValue(str); + if (n <= 0 || n > 63) { + abort(); + } + a8::SetBitFlag(sweep_tags, n); + } + } { int_param1 = a8::XValue(i->param1()); float_param1 = a8::XValue(i->param1()).GetDouble(); diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index a249e19..4302657 100644 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -53,6 +53,7 @@ namespace MetaData float float_param1 = 0; int int_param2 = 0; float float_param2 = 0; + long long sweep_tags = 0; void Init(); }; diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 8172fe8..2b2cf0c 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -52,6 +52,7 @@ public: bool debug_trace = false; bool added_to_over_room = false; a8::Vec2 last_player_jump_pos; + std::map mine_objects; ~Room(); void InitData(RoomInitInfo& init_info); diff --git a/server/gameserver/roomobstacle.cc b/server/gameserver/roomobstacle.cc index 91b580a..b5d9cf6 100644 --- a/server/gameserver/roomobstacle.cc +++ b/server/gameserver/roomobstacle.cc @@ -45,12 +45,18 @@ RoomObstacle::~RoomObstacle() if (!hit_objects_) { A8_SAFE_DELETE(hit_objects_); } + if (meta->sweep_tags != 0) { + room->mine_objects.erase(GetUniId()); + } } void RoomObstacle::Initialize() { Obstacle::Initialize(); xtimer_attacher.xtimer = &room->xtimer; + if (meta->sweep_tags != 0) { + room->mine_objects[GetUniId()] = GetWeakPtrRef(); + } } void RoomObstacle::RecalcSelfCollider() diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index f391f3b..bd9609f 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -71,6 +71,7 @@ message MapThing optional int32 bullet_hit = 28; optional int32 collision_hit = 29; optional int32 explosion_hit = 30; + optional string sweep_tags = 31; } message SafeArea