diff --git a/data/DB_PropExchange.dat b/data/DB_PropExchange.dat
index 380d7ef..aacecc0 100644
--- a/data/DB_PropExchange.dat
+++ b/data/DB_PropExchange.dat
@@ -1,5 +1,5 @@
 
-6ֆ׆ӆԆՆ"����=
+6Նֆ׆ӆԆ"����=
 .؆نچۆ"����=
-WӆԆچՆֆ׆؆نۆ"	�����
-]ՆنӆԆ؆چۆ܆ֆ׆"���
\ No newline at end of file
+WۆӆԆՆֆ׆نچ؆"	�����
+]׆چۆӆՆ؆ن܆Ԇֆ"���
\ No newline at end of file
diff --git a/data/DB_Task.dat b/data/DB_Task.dat
index cc74aba..f43e229 100644
Binary files a/data/DB_Task.dat and b/data/DB_Task.dat differ
diff --git a/data/gameparam.json b/data/gameparam.json
index 01c9755..818194c 100644
--- a/data/gameparam.json
+++ b/data/gameparam.json
@@ -20,7 +20,7 @@
   "MatchSeasonRankMaxNum":50,
   "RobotInviteInitInterval": 1,
   "RobotInviteIntervalMax": 1,
-  "ClosePreCreateRoom": false,
+  "ClosePreCreateRoom": true,
   "AgoraAddress": "http://47.105.78.29:8081",
   "InviteUrl": "http://47.105.78.29:8000/"
 }
\ No newline at end of file
diff --git a/protocol/bag/bag.pb.go b/protocol/bag/bag.pb.go
index 01311ca..7de6cd0 100644
--- a/protocol/bag/bag.pb.go
+++ b/protocol/bag/bag.pb.go
@@ -91,6 +91,9 @@ const (
 	SPacketID_PACKET_ALL_BAG_USE    SPacketID = 2531 //使用背包道具
 	SPacketID_PACKET_SC_SYNCBAGDATA SPacketID = 2532 //背包数据更新
 	SPacketID_PACKET_ALL_BAG_END    SPacketID = 2549 //最大消息号
+	//3000~3099
+	SPacketID_PACKET_PropExchange SPacketID = 3000 // 道具兑换
+	SPacketID_PACKET_ExchangeList SPacketID = 3001 // 兑换列表
 )
 
 // Enum value maps for SPacketID.
@@ -101,6 +104,8 @@ var (
 		2531: "PACKET_ALL_BAG_USE",
 		2532: "PACKET_SC_SYNCBAGDATA",
 		2549: "PACKET_ALL_BAG_END",
+		3000: "PACKET_PropExchange",
+		3001: "PACKET_ExchangeList",
 	}
 	SPacketID_value = map[string]int32{
 		"PACKET_BAG_ZERO":       0,
@@ -108,6 +113,8 @@ var (
 		"PACKET_ALL_BAG_USE":    2531,
 		"PACKET_SC_SYNCBAGDATA": 2532,
 		"PACKET_ALL_BAG_END":    2549,
+		"PACKET_PropExchange":   3000,
+		"PACKET_ExchangeList":   3001,
 	}
 )
 
@@ -562,6 +569,313 @@ func (x *SCSyncBagData) GetInfos() []*ItemInfo {
 	return nil
 }
 
+type PropInfo struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ItemId  int32 `protobuf:"varint,1,opt,name=ItemId,proto3" json:"ItemId,omitempty"`   //物品ID
+	ItemNum int32 `protobuf:"varint,2,opt,name=ItemNum,proto3" json:"ItemNum,omitempty"` //物品数量
+}
+
+func (x *PropInfo) Reset() {
+	*x = PropInfo{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_bag_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *PropInfo) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PropInfo) ProtoMessage() {}
+
+func (x *PropInfo) ProtoReflect() protoreflect.Message {
+	mi := &file_bag_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use PropInfo.ProtoReflect.Descriptor instead.
+func (*PropInfo) Descriptor() ([]byte, []int) {
+	return file_bag_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *PropInfo) GetItemId() int32 {
+	if x != nil {
+		return x.ItemId
+	}
+	return 0
+}
+
+func (x *PropInfo) GetItemNum() int32 {
+	if x != nil {
+		return x.ItemNum
+	}
+	return 0
+}
+
+// PACKET_PropExchange
+type CSPropExchange struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Items []*PropInfo `protobuf:"bytes,1,rep,name=Items,proto3" json:"Items,omitempty"` // 消耗道具
+}
+
+func (x *CSPropExchange) Reset() {
+	*x = CSPropExchange{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_bag_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CSPropExchange) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CSPropExchange) ProtoMessage() {}
+
+func (x *CSPropExchange) ProtoReflect() protoreflect.Message {
+	mi := &file_bag_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use CSPropExchange.ProtoReflect.Descriptor instead.
+func (*CSPropExchange) Descriptor() ([]byte, []int) {
+	return file_bag_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *CSPropExchange) GetItems() []*PropInfo {
+	if x != nil {
+		return x.Items
+	}
+	return nil
+}
+
+type SCPropExchange struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	RetCode     OpResultCode `protobuf:"varint,1,opt,name=RetCode,proto3,enum=bag.OpResultCode" json:"RetCode,omitempty"` // 错误码
+	Items       []*PropInfo  `protobuf:"bytes,2,rep,name=Items,proto3" json:"Items,omitempty"`                            // 获得道具
+	RemainItems []*PropInfo  `protobuf:"bytes,3,rep,name=RemainItems,proto3" json:"RemainItems,omitempty"`                // 被消耗的道具剩余数量
+}
+
+func (x *SCPropExchange) Reset() {
+	*x = SCPropExchange{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_bag_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SCPropExchange) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SCPropExchange) ProtoMessage() {}
+
+func (x *SCPropExchange) ProtoReflect() protoreflect.Message {
+	mi := &file_bag_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SCPropExchange.ProtoReflect.Descriptor instead.
+func (*SCPropExchange) Descriptor() ([]byte, []int) {
+	return file_bag_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *SCPropExchange) GetRetCode() OpResultCode {
+	if x != nil {
+		return x.RetCode
+	}
+	return OpResultCode_OPRC_Sucess
+}
+
+func (x *SCPropExchange) GetItems() []*PropInfo {
+	if x != nil {
+		return x.Items
+	}
+	return nil
+}
+
+func (x *SCPropExchange) GetRemainItems() []*PropInfo {
+	if x != nil {
+		return x.RemainItems
+	}
+	return nil
+}
+
+type ExchangeInfo struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	CostItems []*PropInfo `protobuf:"bytes,1,rep,name=CostItems,proto3" json:"CostItems,omitempty"` // 消耗道具
+	GainItems []*PropInfo `protobuf:"bytes,2,rep,name=GainItems,proto3" json:"GainItems,omitempty"` // 获得道具
+}
+
+func (x *ExchangeInfo) Reset() {
+	*x = ExchangeInfo{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_bag_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ExchangeInfo) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ExchangeInfo) ProtoMessage() {}
+
+func (x *ExchangeInfo) ProtoReflect() protoreflect.Message {
+	mi := &file_bag_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ExchangeInfo.ProtoReflect.Descriptor instead.
+func (*ExchangeInfo) Descriptor() ([]byte, []int) {
+	return file_bag_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *ExchangeInfo) GetCostItems() []*PropInfo {
+	if x != nil {
+		return x.CostItems
+	}
+	return nil
+}
+
+func (x *ExchangeInfo) GetGainItems() []*PropInfo {
+	if x != nil {
+		return x.GainItems
+	}
+	return nil
+}
+
+// PACKET_ExchangeList
+type CSExchangeList struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *CSExchangeList) Reset() {
+	*x = CSExchangeList{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_bag_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CSExchangeList) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CSExchangeList) ProtoMessage() {}
+
+func (x *CSExchangeList) ProtoReflect() protoreflect.Message {
+	mi := &file_bag_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use CSExchangeList.ProtoReflect.Descriptor instead.
+func (*CSExchangeList) Descriptor() ([]byte, []int) {
+	return file_bag_proto_rawDescGZIP(), []int{10}
+}
+
+type SCExchangeList struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Infos []*ExchangeInfo `protobuf:"bytes,1,rep,name=Infos,proto3" json:"Infos,omitempty"` // 兑换列表
+}
+
+func (x *SCExchangeList) Reset() {
+	*x = SCExchangeList{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_bag_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SCExchangeList) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SCExchangeList) ProtoMessage() {}
+
+func (x *SCExchangeList) ProtoReflect() protoreflect.Message {
+	mi := &file_bag_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SCExchangeList.ProtoReflect.Descriptor instead.
+func (*SCExchangeList) Descriptor() ([]byte, []int) {
+	return file_bag_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *SCExchangeList) GetInfos() []*ExchangeInfo {
+	if x != nil {
+		return x.Infos
+	}
+	return nil
+}
+
 var File_bag_proto protoreflect.FileDescriptor
 
 var file_bag_proto_rawDesc = []byte{
@@ -610,25 +924,57 @@ var file_bag_proto_rawDesc = []byte{
 	0x6f, 0x73, 0x22, 0x34, 0x0a, 0x0d, 0x53, 0x43, 0x53, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x67, 0x44,
 	0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x05, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03,
 	0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x62, 0x61, 0x67, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66,
-	0x6f, 0x52, 0x05, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x2a, 0x85, 0x01, 0x0a, 0x0c, 0x4f, 0x70, 0x52,
-	0x65, 0x73, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x50, 0x52,
-	0x43, 0x5f, 0x53, 0x75, 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x50,
-	0x52, 0x43, 0x5f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x50,
-	0x52, 0x43, 0x5f, 0x55, 0x73, 0x65, 0x55, 0x70, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x50,
-	0x52, 0x43, 0x5f, 0x49, 0x64, 0x45, 0x72, 0x72, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x50,
-	0x52, 0x43, 0x5f, 0x44, 0x62, 0x45, 0x72, 0x72, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x50,
-	0x52, 0x43, 0x5f, 0x42, 0x61, 0x67, 0x46, 0x75, 0x6c, 0x6c, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e,
-	0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4e, 0x6f, 0x74, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x10, 0x06,
-	0x2a, 0x88, 0x01, 0x0a, 0x09, 0x53, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x13,
-	0x0a, 0x0f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x42, 0x41, 0x47, 0x5f, 0x5a, 0x45, 0x52,
-	0x4f, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x41, 0x4c,
-	0x4c, 0x5f, 0x42, 0x41, 0x47, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0xe2, 0x13, 0x12, 0x17, 0x0a,
-	0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x41, 0x4c, 0x4c, 0x5f, 0x42, 0x41, 0x47, 0x5f,
-	0x55, 0x53, 0x45, 0x10, 0xe3, 0x13, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54,
-	0x5f, 0x53, 0x43, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x42, 0x41, 0x47, 0x44, 0x41, 0x54, 0x41, 0x10,
-	0xe4, 0x13, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x41, 0x4c, 0x4c,
-	0x5f, 0x42, 0x41, 0x47, 0x5f, 0x45, 0x4e, 0x44, 0x10, 0xf5, 0x13, 0x42, 0x07, 0x5a, 0x05, 0x2e,
-	0x3b, 0x62, 0x61, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x6f, 0x52, 0x05, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x22, 0x3c, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x70,
+	0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07,
+	0x49, 0x74, 0x65, 0x6d, 0x4e, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x49,
+	0x74, 0x65, 0x6d, 0x4e, 0x75, 0x6d, 0x22, 0x35, 0x0a, 0x0e, 0x43, 0x53, 0x50, 0x72, 0x6f, 0x70,
+	0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x49, 0x74, 0x65, 0x6d,
+	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x62, 0x61, 0x67, 0x2e, 0x50, 0x72,
+	0x6f, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x93, 0x01,
+	0x0a, 0x0e, 0x53, 0x43, 0x50, 0x72, 0x6f, 0x70, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65,
+	0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0e, 0x32, 0x11, 0x2e, 0x62, 0x61, 0x67, 0x2e, 0x4f, 0x70, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74,
+	0x43, 0x6f, 0x64, 0x65, 0x52, 0x07, 0x52, 0x65, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a,
+	0x05, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x62,
+	0x61, 0x67, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x49, 0x74, 0x65,
+	0x6d, 0x73, 0x12, 0x2f, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d,
+	0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x62, 0x61, 0x67, 0x2e, 0x50, 0x72,
+	0x6f, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x52, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x49, 0x74,
+	0x65, 0x6d, 0x73, 0x22, 0x68, 0x0a, 0x0c, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x49,
+	0x6e, 0x66, 0x6f, 0x12, 0x2b, 0x0a, 0x09, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x73,
+	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x62, 0x61, 0x67, 0x2e, 0x50, 0x72, 0x6f,
+	0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x73,
+	0x12, 0x2b, 0x0a, 0x09, 0x47, 0x61, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x02, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x62, 0x61, 0x67, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x49, 0x6e,
+	0x66, 0x6f, 0x52, 0x09, 0x47, 0x61, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x10, 0x0a,
+	0x0e, 0x43, 0x53, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x22,
+	0x39, 0x0a, 0x0e, 0x53, 0x43, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73,
+	0x74, 0x12, 0x27, 0x0a, 0x05, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x11, 0x2e, 0x62, 0x61, 0x67, 0x2e, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x49,
+	0x6e, 0x66, 0x6f, 0x52, 0x05, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x2a, 0x85, 0x01, 0x0a, 0x0c, 0x4f,
+	0x70, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x4f,
+	0x50, 0x52, 0x43, 0x5f, 0x53, 0x75, 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a,
+	0x4f, 0x50, 0x52, 0x43, 0x5f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a,
+	0x4f, 0x50, 0x52, 0x43, 0x5f, 0x55, 0x73, 0x65, 0x55, 0x70, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a,
+	0x4f, 0x50, 0x52, 0x43, 0x5f, 0x49, 0x64, 0x45, 0x72, 0x72, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a,
+	0x4f, 0x50, 0x52, 0x43, 0x5f, 0x44, 0x62, 0x45, 0x72, 0x72, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c,
+	0x4f, 0x50, 0x52, 0x43, 0x5f, 0x42, 0x61, 0x67, 0x46, 0x75, 0x6c, 0x6c, 0x10, 0x05, 0x12, 0x12,
+	0x0a, 0x0e, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4e, 0x6f, 0x74, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72,
+	0x10, 0x06, 0x2a, 0xbc, 0x01, 0x0a, 0x09, 0x53, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44,
+	0x12, 0x13, 0x0a, 0x0f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x42, 0x41, 0x47, 0x5f, 0x5a,
+	0x45, 0x52, 0x4f, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f,
+	0x41, 0x4c, 0x4c, 0x5f, 0x42, 0x41, 0x47, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0xe2, 0x13, 0x12,
+	0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x41, 0x4c, 0x4c, 0x5f, 0x42, 0x41,
+	0x47, 0x5f, 0x55, 0x53, 0x45, 0x10, 0xe3, 0x13, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b,
+	0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x42, 0x41, 0x47, 0x44, 0x41, 0x54,
+	0x41, 0x10, 0xe4, 0x13, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x41,
+	0x4c, 0x4c, 0x5f, 0x42, 0x41, 0x47, 0x5f, 0x45, 0x4e, 0x44, 0x10, 0xf5, 0x13, 0x12, 0x18, 0x0a,
+	0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x50, 0x72, 0x6f, 0x70, 0x45, 0x78, 0x63, 0x68,
+	0x61, 0x6e, 0x67, 0x65, 0x10, 0xb8, 0x17, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45,
+	0x54, 0x5f, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x10, 0xb9,
+	0x17, 0x42, 0x07, 0x5a, 0x05, 0x2e, 0x3b, 0x62, 0x61, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x33,
 }
 
 var (
@@ -644,28 +990,41 @@ func file_bag_proto_rawDescGZIP() []byte {
 }
 
 var file_bag_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
-var file_bag_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
+var file_bag_proto_msgTypes = make([]protoimpl.MessageInfo, 12)
 var file_bag_proto_goTypes = []interface{}{
-	(OpResultCode)(0),     // 0: bag.OpResultCode
-	(SPacketID)(0),        // 1: bag.SPacketID
-	(*ItemInfo)(nil),      // 2: bag.ItemInfo
-	(*CSBagInfo)(nil),     // 3: bag.CSBagInfo
-	(*SCBagInfo)(nil),     // 4: bag.SCBagInfo
-	(*CSUpBagInfo)(nil),   // 5: bag.CSUpBagInfo
-	(*SCUpBagInfo)(nil),   // 6: bag.SCUpBagInfo
-	(*SCSyncBagData)(nil), // 7: bag.SCSyncBagData
+	(OpResultCode)(0),      // 0: bag.OpResultCode
+	(SPacketID)(0),         // 1: bag.SPacketID
+	(*ItemInfo)(nil),       // 2: bag.ItemInfo
+	(*CSBagInfo)(nil),      // 3: bag.CSBagInfo
+	(*SCBagInfo)(nil),      // 4: bag.SCBagInfo
+	(*CSUpBagInfo)(nil),    // 5: bag.CSUpBagInfo
+	(*SCUpBagInfo)(nil),    // 6: bag.SCUpBagInfo
+	(*SCSyncBagData)(nil),  // 7: bag.SCSyncBagData
+	(*PropInfo)(nil),       // 8: bag.PropInfo
+	(*CSPropExchange)(nil), // 9: bag.CSPropExchange
+	(*SCPropExchange)(nil), // 10: bag.SCPropExchange
+	(*ExchangeInfo)(nil),   // 11: bag.ExchangeInfo
+	(*CSExchangeList)(nil), // 12: bag.CSExchangeList
+	(*SCExchangeList)(nil), // 13: bag.SCExchangeList
 }
 var file_bag_proto_depIdxs = []int32{
-	0, // 0: bag.SCBagInfo.RetCode:type_name -> bag.OpResultCode
-	2, // 1: bag.SCBagInfo.Infos:type_name -> bag.ItemInfo
-	0, // 2: bag.SCUpBagInfo.RetCode:type_name -> bag.OpResultCode
-	2, // 3: bag.SCUpBagInfo.Infos:type_name -> bag.ItemInfo
-	2, // 4: bag.SCSyncBagData.Infos:type_name -> bag.ItemInfo
-	5, // [5:5] is the sub-list for method output_type
-	5, // [5:5] is the sub-list for method input_type
-	5, // [5:5] is the sub-list for extension type_name
-	5, // [5:5] is the sub-list for extension extendee
-	0, // [0:5] is the sub-list for field type_name
+	0,  // 0: bag.SCBagInfo.RetCode:type_name -> bag.OpResultCode
+	2,  // 1: bag.SCBagInfo.Infos:type_name -> bag.ItemInfo
+	0,  // 2: bag.SCUpBagInfo.RetCode:type_name -> bag.OpResultCode
+	2,  // 3: bag.SCUpBagInfo.Infos:type_name -> bag.ItemInfo
+	2,  // 4: bag.SCSyncBagData.Infos:type_name -> bag.ItemInfo
+	8,  // 5: bag.CSPropExchange.Items:type_name -> bag.PropInfo
+	0,  // 6: bag.SCPropExchange.RetCode:type_name -> bag.OpResultCode
+	8,  // 7: bag.SCPropExchange.Items:type_name -> bag.PropInfo
+	8,  // 8: bag.SCPropExchange.RemainItems:type_name -> bag.PropInfo
+	8,  // 9: bag.ExchangeInfo.CostItems:type_name -> bag.PropInfo
+	8,  // 10: bag.ExchangeInfo.GainItems:type_name -> bag.PropInfo
+	11, // 11: bag.SCExchangeList.Infos:type_name -> bag.ExchangeInfo
+	12, // [12:12] is the sub-list for method output_type
+	12, // [12:12] is the sub-list for method input_type
+	12, // [12:12] is the sub-list for extension type_name
+	12, // [12:12] is the sub-list for extension extendee
+	0,  // [0:12] is the sub-list for field type_name
 }
 
 func init() { file_bag_proto_init() }
@@ -746,6 +1105,78 @@ func file_bag_proto_init() {
 				return nil
 			}
 		}
+		file_bag_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PropInfo); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_bag_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CSPropExchange); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_bag_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SCPropExchange); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_bag_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ExchangeInfo); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_bag_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CSExchangeList); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_bag_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SCExchangeList); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
@@ -753,7 +1184,7 @@ func file_bag_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_bag_proto_rawDesc,
 			NumEnums:      2,
-			NumMessages:   6,
+			NumMessages:   12,
 			NumExtensions: 0,
 			NumServices:   0,
 		},
diff --git a/protocol/bag/bag.proto b/protocol/bag/bag.proto
index 832383f..49e6a1a 100644
--- a/protocol/bag/bag.proto
+++ b/protocol/bag/bag.proto
@@ -18,6 +18,9 @@ enum SPacketID {
   PACKET_ALL_BAG_USE = 2531;  //使用背包道具
   PACKET_SC_SYNCBAGDATA = 2532;//背包数据更新
   PACKET_ALL_BAG_END = 2549;  //最大消息号
+  //3000~3099
+  PACKET_PropExchange = 3000; // 道具兑换
+  PACKET_ExchangeList = 3001; // 兑换列表
 }
 //物品信息 后续精简
 message ItemInfo{
@@ -75,4 +78,30 @@ message SCUpBagInfo {
 //PACKET_SC_SYNCBAGDATA
 message SCSyncBagData{
   repeated ItemInfo Infos = 1;// 物品信息
+}
+
+message PropInfo{
+  int32 ItemId = 1;//物品ID
+  int32 ItemNum = 2;//物品数量
+}
+
+// PACKET_PropExchange
+message CSPropExchange{
+  repeated PropInfo Items = 1; // 消耗道具
+}
+message SCPropExchange{
+  OpResultCode RetCode = 1; // 错误码
+  repeated PropInfo Items = 2; // 获得道具
+  repeated PropInfo RemainItems = 3; // 被消耗的道具剩余数量
+}
+
+message ExchangeInfo{
+  repeated PropInfo CostItems = 1; // 消耗道具
+  repeated PropInfo GainItems = 2; // 获得道具
+}
+
+// PACKET_ExchangeList
+message CSExchangeList{}
+message SCExchangeList{
+  repeated ExchangeInfo Infos = 1; // 兑换列表
 }
\ No newline at end of file
diff --git a/protocol/doc.md b/protocol/doc.md
index 4ffacf5..01bc184 100644
--- a/protocol/doc.md
+++ b/protocol/doc.md
@@ -47,6 +47,7 @@
 
 #### bag（背包）
 - 2530~2549
+- 3000~3099
 
 #### Pets（人物宠物）
 - 2550~2579
diff --git a/protocol/welfare/welfare.proto b/protocol/welfare/welfare.proto
index 8920900..fa3b7d7 100644
--- a/protocol/welfare/welfare.proto
+++ b/protocol/welfare/welfare.proto
@@ -45,9 +45,6 @@ enum SPacketID {
   PACKET_SCInviteInfo = 2903;//邀请信息
   PACKET_CSBindInvite = 2904;//绑定邀请人
   PACKET_SCBindInvite = 2905;//绑定邀请人
-  // 集卡活动
-
-
 }
 
 //救济金领取
