aozhiwei 81e5db36a8 1
2022-05-27 13:07:28 +08:00

1134 lines
24 KiB
Protocol Buffer

package cs;
enum Constant_e
{
ProtoVersion = 2022032201;
}
message CMPing
{
}
message SMPing
{
optional int32 param1 = 1;
}
message SMRpcError
{
optional int32 error_code = 1;
optional string error_msg = 2;
optional string debug_msg = 3;
optional string file = 4;
optional int32 lineno = 5;
optional int32 error_param = 6;
}
message MFPair
{
optional int32 key = 1;
optional int32 value = 2;
}
message MFPair64
{
optional int64 key = 1;
optional int64 value = 2;
}
message MFTuple
{
repeated int32 values = 1;
}
message MFVec2
{
optional float x = 1;
optional float y = 2;
}
message MFPropertyChg
{
optional int32 obj_id = 1;
optional int32 property_type = 2;
optional int32 property_subtype = 3;
optional float value = 4;
}
message MFCollider
{
optional int32 shape = 1;
optional int32 width = 2;
optional int32 height = 3;
}
message MFMapObject
{
optional int32 object_id = 1;
optional MFVec2 pos = 2;
}
message MFPlayerInfo
{
optional int32 player_id = 1;
optional int32 team_id = 2;
optional string name = 3;
}
message MFGoods
{
optional string name = 1;
optional int32 num = 2;
}
message MFPlug
{
optional string name = 1;
optional int32 id = 2;
optional int32 param = 3;
}
message MFWeapon
{
optional int32 weapon_id = 1;
optional int32 weapon_lv = 2;
optional string weapon_uniid = 3;
optional int32 ammo = 4;
optional int32 volume = 5;
}
message MFSkin
{
optional int32 skin_id = 1;
optional int32 skin_lv = 2;
}
message MFPlayerPart
{
optional int32 obj_uniid = 1;
optional MFVec2 pos = 2;
optional MFVec2 dir = 3;
optional float speed = 4;
}
message MFAttrAddition
{
optional int32 attr_id = 1;
optional float abs_val = 2;
optional float rate_val = 3;
}
message MFPlayerFull
{
optional int32 obj_uniid = 1;
optional MFVec2 pos = 2;
optional MFVec2 dir = 3;
optional int64 guild_id = 4;
optional float max_health = 5;
optional float health = 6;
optional bool dead = 7;
optional bool downed = 8;
optional bool disconnected = 9;
optional int32 anim_type = 10;
optional int32 anim_seq = 11;
repeated MFSkin skin = 13;
optional int32 backpack = 14;
optional int32 helmet = 16;
optional int32 chest = 17;
optional MFWeapon weapon = 18;
optional int32 energy_shield = 19;
optional int32 vip = 20;
optional int32 sdmg = 21;
optional int32 max_energy_shield = 22;
repeated MFBodyState states = 23;
optional int32 kill_count = 24;
optional int32 emoji1 = 25;
optional int32 emoji2 = 26;
optional int32 parachute = 27;
repeated MFBuff buff_list = 28;
optional int32 car_uniid = 29;
optional int32 car_seat = 34;
optional bool can_revive = 30;
optional int32 revive_countdown = 31;
optional string killer_name = 32;
optional int32 killer_id = 33;
optional int32 vip_lv = 35 [default = 0];
optional int32 head_frame = 36 [default = 0];
optional int32 sex = 37 [default = 0];
repeated MFSkill skill_list = 38;
repeated MFAttrAddition attr_addition= 61;
optional int32 follow_target = 62 [default = 0];
optional int32 charid = 44;
optional float speed = 45;
optional float shoot_offset_x = 50 [default = 0];
optional float shoot_offset_y = 51 [default = 0];
optional string user_data = 60 [default = ""];
}
message MFObstaclePart
{
optional int32 obj_uniid = 1;
optional MFVec2 pos = 2;
optional float scale = 3;
}
message MFObstacleFull
{
optional int32 obj_uniid = 1;
optional MFVec2 pos = 2;
optional float scale = 3;
optional int32 born_frameno = 4 [default = 0];
optional int32 obstacle_id = 6;
optional float health = 7;
optional bool dead = 8;
optional bool dead_at_thisframe = 9;
optional bool is_door = 20;
optional int32 door_id = 22;
optional int32 door_old_state = 23;
optional int32 door_new_state = 24;
optional int32 door_house_uniid = 25;
optional int32 door_house_id = 26;
optional float door_width = 27;
optional float door_height = 28;
optional int32 door_open_times = 29;
optional string button_name = 30;
optional MFCollider collider = 31;
}
message MFBuildingPart
{
optional int32 obj_uniid = 1;
optional MFVec2 pos = 2;
}
message MFBuildingFull
{
optional int32 obj_uniid = 1;
optional MFVec2 pos = 2;
optional int32 building_id = 3;
optional bool ceiling_dead = 6;
}
message MFLootSpawnerPart
{
optional int32 obj_uniid = 1;
optional MFVec2 pos = 2;
optional int32 loot_id = 3;
}
message MFLootSpawnerFull
{
optional int32 obj_uniid = 1;
optional MFVec2 pos = 2;
optional int32 loot_id = 3;
}
message MFLootPart
{
optional int32 obj_uniid = 1;
optional MFVec2 pos = 2;
}
message MFLootFull
{
optional int32 obj_uniid = 1;
optional MFVec2 pos = 2;
optional MFVec2 born_pos = 3;
optional bool show_anim = 4;
optional int32 item_id = 6;
optional int32 count = 7;
optional int32 age_ms = 8;
optional int32 item_level = 9 [default = 1];
}
message MFDeadBodyPart
{
optional int32 obj_uniid = 1;
optional MFVec2 pos = 2;
}
message MFDeadBodyFull
{
optional int32 obj_uniid = 1;
optional MFVec2 pos = 2;
optional int32 player_id = 3;
optional int32 inkjet = 6;
}
message MFDecalPart
{
optional int32 obj_uniid = 1;
optional MFVec2 pos = 2;
optional int32 decal_id = 3;
}
message MFDecalFull
{
optional int32 obj_uniid = 1;
optional MFVec2 pos = 2;
optional int32 decal_id = 3;
}
message MFProjectilePart
{
optional int32 obj_uniid = 1;
optional MFVec2 pos = 2;
optional float pos_z = 3;
}
message MFProjectileFull
{
optional int32 obj_uniid = 1;
optional MFVec2 pos = 2;
optional float pos_z = 3;
}
message MFHeroPart
{
optional int32 obj_uniid = 1;
optional MFVec2 pos = 2;
optional MFVec2 dir = 3;
}
message MFHeroFull
{
optional int32 obj_uniid = 1;
optional MFVec2 pos = 2;
optional MFVec2 dir = 3;
optional int32 heroid = 4;
optional int32 master_uniid = 5;
optional float health = 10;
optional bool dead = 11;
repeated MFBuff buff_list = 12;
optional float max_health = 13;
}
message MFSmokePart
{
optional int32 obj_uniid = 1;
optional MFVec2 pos = 2;
optional float rad = 3;
}
message MFSmokeFull
{
optional int32 obj_uniid = 1;
optional MFVec2 pos = 2;
optional float rad = 3;
}
message MFCarPart
{
optional int32 obj_uniid = 1;
optional MFVec2 pos = 2;
optional MFVec2 dir = 3;
}
message MFCarFull
{
optional int32 obj_uniid = 1;
optional MFVec2 pos = 2;
optional MFVec2 dir = 3;
optional int32 car_id = 4;
optional int32 driver = 5;
optional int32 heroid = 7;
optional float health = 10;
optional bool dead = 11;
repeated MFBuff buff_list = 12;
optional float max_health = 13;
optional int32 oil = 14;
optional int32 max_oil = 15;
optional int32 bullet_num = 16;
repeated MFPlayerFull passengers = 6;
optional int32 seat_num = 17;
optional int32 born_frameno = 8;
}
message MFObjectPart
{
optional int32 object_type = 1;
optional MFPlayerPart union_obj_1 = 2;
optional MFObstaclePart union_obj_2 = 3;
optional MFBuildingPart union_obj_3 = 4;
optional MFLootSpawnerPart union_obj_4 = 5;
optional MFLootPart union_obj_5 = 6;
optional MFDeadBodyPart union_obj_6 = 7;
optional MFDecalPart union_obj_7 = 8;
optional MFProjectilePart union_obj_8 = 9;
optional MFSmokePart union_obj_9 = 10;
optional MFHeroPart union_obj_10 = 11;
optional MFCarPart union_obj_11 = 12;
}
message MFObjectFull
{
optional int32 object_type = 1;
optional MFPlayerFull union_obj_1 = 2;
optional MFObstacleFull union_obj_2 = 3;
optional MFBuildingFull union_obj_3 = 4;
optional MFLootSpawnerFull union_obj_4 = 5;
optional MFLootFull union_obj_5 = 6;
optional MFDeadBodyFull union_obj_6 = 7;
optional MFDecalFull union_obj_7 = 8;
optional MFProjectileFull union_obj_8 = 9;
optional MFSmokeFull union_obj_9 = 10;
optional MFHeroFull union_obj_10 = 11;
optional MFCarFull union_obj_11 = 12;
optional int32 obj_uniid = 14;
optional int32 object_flags = 15;
}
message MFActivePlayerData
{
optional int32 action_type = 3;
optional int32 action_duration = 5;
optional int32 action_item_id = 6;
optional int32 action_target_id = 7;
optional int32 action_frameno = 1;
repeated MFPair items = 8;
repeated MFSkin skin = 30;
optional int32 backpack = 31;
optional int32 helmet = 32;
optional int32 chest = 33;
optional float max_health = 34;
optional float health = 35;
optional int32 cur_scope = 10;
repeated int32 inventory = 11;
optional int32 cur_weapon_idx = 15;
repeated MFWeapon weapons = 16;
optional int32 energy_shield = 40;
optional int32 max_energy_shield = 41;
optional int32 spectator_count = 20;
repeated MFBodyState states = 27;
repeated MFSkill skill_list = 28;
repeated MFAttrAddition attr_addition= 61;
optional string name = 62;
optional float shoot_offset_x = 50 [default = 0];
optional float shoot_offset_y = 51 [default = 0];
optional int32 dive_oxygen_max = 63;
optional int32 dive_oxygen_curr = 64;
}
message MFGasData
{
optional int32 mode = 1;
optional float duration = 2;
optional MFVec2 pos_old = 3;
optional MFVec2 pos_new = 4;
optional float rad_old = 5;
optional float rad_new = 6;
}
message MFTeamData
{
optional int32 team_id = 61;
optional int32 player_id = 1;
optional MFVec2 pos = 2;
optional MFVec2 dir = 3;
optional float health = 4;
optional bool disconnected = 5 [default = false];
optional bool dead = 6 [default = false];
optional bool downed = 7 [default = false];
optional string name = 8;
optional float max_health = 9;
optional bool riding = 40 [default = false];
optional string user_data = 60 [default = ""];
optional int32 can_follow = 62 [default = 0];
optional string account_id = 10;
optional string avatar_url = 11;
optional int64 user_value1 = 31;
optional int64 user_value2 = 32;
optional int64 user_value3 = 33;
optional int64 guild_id = 34;
optional int32 vip_lv = 35 [default = 0];
optional int32 head_frame = 36 [default = 0];
optional int32 sex = 37 [default = 0];
repeated MFSkin skin = 39;
}
message MFBullet
{
optional int32 player_id = 1;
optional int32 bullet_id = 2;
optional MFVec2 pos = 3;
optional MFVec2 dir = 4;
optional int32 gun_lv = 5;
optional int32 bulletskin = 6;
optional bool crit = 7;
optional int32 reflect_count = 8;
optional int32 reflect_objid = 9;
optional int32 gun_id = 10;
optional float fly_distance = 11;
optional int32 bullet_uniid = 12;
}
message MFShot
{
optional int32 player_id = 1;
optional MFWeapon weapon = 2;
optional bool offhand = 3;
optional int32 bullskin = 4;
optional int32 hole = 5 [default = 0];
}
message MFExplosion
{
optional int32 item_id = 1;
optional MFVec2 pos = 2;
optional int32 player_id = 3;
optional int32 effect = 4 [default = 0];
}
message MFSmoke
{
optional int32 item_id = 1;
optional MFVec2 pos = 2;
optional int32 player_id = 4;
optional float time_addition = 5;
}
message MFEmote
{
optional int32 emote_id = 1;
optional int32 player_id = 3;
optional string msg = 5;
}
message MFPlayerStats
{
optional int32 player_id = 1;
optional string player_avatar_url = 2;
optional int32 time_alive = 3;
optional int32 kills = 4;
optional int32 damage_amount = 8;
optional int32 heal_amount = 20;
optional int32 history_time_alive = 30;
optional int32 history_kills = 31;
optional int32 history_damage_amount = 32;
optional int32 history_heal_amount = 33;
optional int32 gold = 10;
optional int32 score = 11;
repeated MFPair items = 6;
optional int32 pass_score = 9;
optional int32 rank_score = 13;
optional bool has_pass = 27;
repeated MFPair extra_drop = 12;
optional bool dead = 5;
optional int32 killer_id = 7;
optional string killer_name = 40;
optional string killer_avatar_url = 41;
optional string killer_account_id = 42;
optional string account_id = 21;
optional int64 guild_id = 22;
optional int32 rescue_guild_member = 23;
optional int32 vip_lv = 35 [default = 0];
optional int32 head_frame = 36 [default = 0];
optional int32 sex = 37 [default = 0];
optional int32 charid = 38;
optional int32 team_id = 39;
optional string nickname = 43;
repeated MFSkin skin = 45;
}
message MFAirDrop
{
optional int32 appear_time = 1;
optional int32 box_id = 2;
optional MFVec2 pos = 3;
}
message MFAirRaid
{
optional int32 appear_time = 1;
optional MFVec2 pos = 3;
optional float rad = 4;
}
message MFBuff
{
optional int32 buff_id = 1;
optional float left_time = 2;
optional float lasting_time = 3;
repeated float params = 4;
optional int32 buff_uniid = 5;
}
message MFBuffChg
{
optional int32 obj_id = 1;
optional int32 chg = 2;
optional MFBuff buff = 3;
}
message MFBodyState
{
optional int32 state_type = 1;
optional float left_time = 2;
optional float lasting_time = 3;
}
message MFPlane
{
optional MFVec2 start_point = 1;
optional MFVec2 end_point = 2;
optional MFVec2 pos = 3;
}
message MFMapCarInfo
{
optional int32 car_id = 1;
optional MFVec2 pos = 2;
}
message MFTeamMember
{
optional string account_id = 1;
optional int32 rank = 2;
optional bool is_leader = 3;
optional int32 game_times = 4;
optional int32 win_times = 5;
optional int32 kill_times = 6;
optional int32 create_time = 7;
}
message MFPosition
{
optional int32 obj_uniid = 1;
optional MFVec2 pos = 2;
optional MFVec2 dir = 3;
optional int32 race = 4;
}
message MFSkill
{
optional int32 skill_id = 1;
optional int32 left_time = 2;
optional int32 cd_time = 3;
optional int32 curr_times = 4;
optional int32 max_times = 5;
optional int32 exp = 7;
optional int32 max_exp = 8;
}
message MFPlaySkill
{
optional int32 obj_uniid = 1;
optional int32 skill_id = 2;
}
message MFTextElement
{
optional string text = 1;
optional int32 color = 2 [default = 0xFFFFFF];
}
message MFImageElement
{
optional int32 id = 1;
}
message MFRichTextElement
{
optional int32 element_type = 1;
optional MFTextElement union_obj_1 = 2;
optional MFImageElement union_obj_2 = 3;
}
message MFMatchTeamMember
{
optional string account_id = 1;
optional string name = 2;
optional string avatar_url = 3;
optional int32 hero_id = 4;
repeated MFWeapon weapons = 5;
repeated MFSkin skins = 6;
repeated MFPair skill_list = 7;
optional bool is_leader = 8;
optional int32 state = 9;
optional int32 head_frame = 10;
repeated int32 baseskin = 11;
optional int32 hero_skin = 12;
}
message MFMatchInfo
{
repeated MFMatchTeamMember members = 1;
optional int32 phase = 2;
optional int32 countdown = 3;
optional int32 predict_time = 4;
}
message MFOverRewardItem
{
optional int32 obtain_gold = 1;
optional int32 gold_limit = 2;
}
message MFOverReward
{
optional MFOverRewardItem hero = 1;
optional MFOverRewardItem weapon1 = 2;
optional MFOverRewardItem weapon2 = 3;
optional int32 bounds = 4;
optional int32 total = 5;
}
message CMJoin
{
optional int32 server_id = 1;
optional string team_uuid = 2;
optional string account_id = 3;
optional int32 team_mode = 4;
optional int32 proto_version = 5;
optional bool auto_fill = 6;
optional int32 bot = 7;
optional string name = 8;
optional bool use_touch = 9;
repeated int32 emotes = 10;
optional string avatar_url = 11;
optional int32 energy_shield = 12;
repeated int32 baseskin = 13;
optional int32 basemelee = 14;
repeated int32 buff_list = 15;
repeated MFWeapon weapons = 17;
repeated MFSkin skins = 18;
repeated int32 prepare_items = 19;
repeated MFPair prepare_items2 = 29;
optional string session_id = 20;
optional string from_appid = 21;
optional float atk_add = 22;
optional string pre_settlement_info = 23;
optional int32 emoji1 = 24;
optional int32 emoji2 = 25;
optional int32 parachute = 26;
optional bool has_pass = 27;
optional int32 today_enter_times = 28;
repeated MFWeapon grow_weapons = 30;
optional int64 user_value1 = 31;
optional int64 user_value2 = 32;
optional int64 user_value3 = 33;
optional int64 guild_id = 34;
optional int32 vip_lv = 35 [default = 0];
optional int32 head_frame = 36 [default = 0];
optional int32 sex = 37 [default = 0];
optional bool force_entry_newbie_room = 50;
repeated MFTeamMember team_members = 51;
optional int32 room_mode = 52;
optional int32 mapid = 53;
repeated MFPair skill_list = 54;
optional string user_data = 60 [default = ""];
optional int32 hero_id = 61;
repeated MFPair talent_list = 64;
optional int32 show_team_ui = 62;
optional int32 hero_skin = 63;
optional string pre_battle_payload = 70;
optional string hero_uniid = 71;
}
message CMReconnect
{
optional int32 server_id = 1;
optional string team_uuid = 2;
optional string account_id = 3;
optional string session_id = 4;
optional string room_uuid = 5;
optional string server_info = 6;
}
message SMReconnect
{
optional int32 errcode = 1;
optional string errmsg = 2;
}
message CMMove
{
optional int32 seq = 1;
optional MFVec2 move_dir = 2;
optional MFVec2 attack_dir = 3;
optional bool shot_start = 4;
optional bool shot_hold = 5;
optional bool reload = 6;
optional float fly_distance = 7;
optional int32 select_weapon = 8;
optional int32 drop_weapon = 9;
optional bool cancel_action = 10;
optional int32 use_item_idx = 11;
optional int32 use_item_id = 12;
optional int32 use_scope = 13;
optional bool interaction = 14;
repeated int32 interaction_objids = 15;
optional bool aiming = 16;
optional bool use_skill = 17;
optional int32 skill_id = 18;
optional int32 skill_target_id = 19;
optional MFVec2 skill_dir = 20;
optional float skill_distance = 21;
optional float skill_param1 = 22;
optional bool spectate = 30;
optional int32 emote = 31;
optional bool jump = 32;
optional bool get_down = 33;
optional int32 get_on = 36;
optional int32 switch_seat = 37;
optional int32 follow = 38;
optional int32 dive = 39;
}
message CMExecCommand
{
optional string cmd = 1;
}
message CMDropItem
{
optional int32 item_id = 1;
optional int32 weapon_idx = 2;
}
message CMEmote
{
optional int32 type = 1;
optional MFVec2 pos = 2;
optional bool team_only = 4;
}
message CMVoice
{
optional string download_url = 2;
}
message CMGameOver
{
}
message CMWatchWar
{
}
message CMLeave
{
}
message CMRevive
{
}
message CMCancelRevive
{
}
message CMAdStart
{
}
message CMAdCancel
{
}
message CMAdEnd
{
optional int32 param = 1;
}
message CMGetBoxInfo
{
optional int32 box_id = 1;
}
message CMOpenBox
{
optional int32 box_id = 1;
}
message CMMatchCancel
{
}
message CMMatchChoose
{
optional int32 hero_id = 1;
repeated MFWeapon weapons = 2;
repeated MFSkin skins = 3;
repeated MFPair skill_list = 4;
repeated int32 baseskin = 5;
optional int32 hero_skin = 6;
optional string hero_uniid = 7;
}
message CMMatchStartGame
{
}
message CMMatchCancelStartGame
{
}
message CMMatchSendMsg
{
repeated string target_list = 1;
optional string content = 2;
}
message CMMatchBroadcastMsg
{
optional int32 exclude_self = 1;
optional string content = 2;
}
message SMWatchWar
{
optional int32 error_code = 1 [default = 0];
optional string error_msg = 2;
optional string name = 3;
}
message SMJoinedNotify
{
optional int32 team_mode = 1;
optional int32 player_id = 2;
optional bool started = 3;
optional string room_uuid = 4;
optional int32 map_type = 5;
optional bool elo_start = 6;
optional int32 error_code = 7;
optional int32 error_msg = 10;
optional int32 room_mode = 8;
optional string server_info = 9;
}
message SMMapInfo
{
optional int32 map_id = 1;
optional float map_width = 2;
optional float map_height = 3;
repeated MFMapObject objects = 6;
optional int32 player_id = 7;
optional bool started = 8;
optional string room_uuid = 9;
optional string server_info = 10;
}
message SMPlayerInfo
{
optional MFPlayerInfo info = 1;
}
message SMUpdate
{
repeated int32 out_objids = 1;
repeated int32 del_objids = 2;
repeated MFObjectFull full_objects = 3;
repeated MFObjectPart part_objects = 4;
optional int32 active_player_id = 5;
optional MFActivePlayerData active_player_data = 6;
optional int32 alive_count = 15;
optional int32 gas_progress = 16;
optional MFVec2 gas_pos_old = 30;
optional MFGasData gas_data = 17;
repeated MFTeamData team_data = 18;
repeated MFBullet bullets = 20;
repeated MFShot shots = 21;
repeated MFExplosion explosions = 22;
repeated MFSmoke smokes = 25;
repeated MFEmote emotes = 23;
optional MFAirDrop airdrop = 26;
optional MFPlane plane = 27;
repeated MFBuffChg chged_buff_list = 28;
repeated MFPropertyChg chged_property_list = 31;
repeated MFPlaySkill play_skill_list = 32;
optional MFAirRaid airraid = 33;
repeated MFTuple dead_alive_objs = 42;
repeated MFPosition object_positions = 43;
optional int32 game_left_time = 45;
optional int32 frameno = 46;
repeated int32 del_bullets = 47;
}
message SMRollMsg
{
repeated MFRichTextElement elements = 1;
}
message SMPlayerStats
{
optional MFPlayerStats player_stats = 1;
}
message SMGameOver
{
optional int32 team_id = 1;
optional int32 team_rank = 2;
optional int32 team_allcnt = 3;
optional bool game_over = 4;
optional bool victory = 5;
optional int32 total_human_num = 12;
optional int32 alive_human_num = 13;
optional int32 watchable = 8;
repeated MFPlayerStats player_stats = 6;
optional string room_uuid = 7;
repeated MFTeamData team_data = 10;
repeated MFTuple spoils_items = 11;
optional MFOverReward reward = 14;
}
message SMLeave
{
}
message SMGetBoxInfo
{
optional int32 box_id = 1;
repeated MFTuple items = 2;
}
message SMOpenBox
{
optional int32 box_id = 1;
optional int32 errcode = 2;
optional string errmsg = 3;
repeated MFTuple items = 4;
}
message SMDisconnectNotify
{
optional string reason = 1;
}
message SMVoiceNotify
{
optional string account_id = 2;
optional string download_url = 3;
}
message SMDebugMsg
{
optional string debug_msg = 3;
}
message SMWxVoip
{
optional string group_id = 1;
}
message SMUiUpdate
{
optional int32 alive_count = 1;
optional int32 kill_count = 2;
repeated MFMapCarInfo car_list = 3;
optional int32 zombie_num = 10;
optional int32 human_num = 11;
}
message SMGameStart
{
}
message SMSysPiaoMsg
{
optional string msg = 1;
optional int32 color = 2;
optional int32 duration = 3;
}
message SMShowCountdown
{
optional string msg = 1;
optional int32 countdown = 2;
optional int32 msg_type = 3;
}
message SMShowTeamUI
{
}
message SMUpdateMatchInfo
{
optional MFMatchInfo info = 1;
}
message SMMatchMemberMsgNotify
{
optional string sender = 1;
optional string content = 2;
}
message SMGetItemNotify
{
repeated MFPair items = 8;
}