--[[ 服务器下发的角色信息结构体 ]] RoleVo = RoleVo or BaseClass(BaseVo) local RoleVo = RoleVo local UserMsgAdapter_ReadFmt = UserMsgAdapter.ReadFmt local UserMsgAdapter_ReadFmt2 = UserMsgAdapter.ReadFmt2 RoleVo.PK_STATUS = { Peace = 0, --和平 Force = 1, --强制 All = 2, --全体 GUILD = 3, --社团模式 Local = 4, --本服(只能攻击其它服) ForcePeace = 9, --强制和平 } RoleVo.Act_Flag = { GUILD_WAR_EQUIP_CAMION= 1, -- 本服团战 CONVOY_ROB= 2, -- 护送抢夺“劫”字形象 KF_TOWN_WAR_SHIP= 3, -- 跨服城战船形象 RAGEWAR_TOP= 5, -- 狂战领域积分第一标识 MELEE_GRADE= 6, -- 大乱斗段位形象 CHARM_BEACH= 7, -- 魅力海滩休闲状态 FISHING= 8, -- 钓鱼状态 FISHING_ACT= 12, -- 钓鱼动作id GUILD_WAR_EQUIP_BLUNT= 13, -- 公会争霸冲车形象 CS_1VN_SIDE= 14, -- 跨服1vn身份 (1擂主) CHARM_BEACH_CHAIR= 15, -- 魅力海滩座椅交互(场景物件id) CONVOY= 16, -- 护送形象 MATE_RHYTHM_MASTER= 17, -- 羁绊-节奏大师-跳舞标识 MATE_CATCH_BALL= 18, -- 羁绊-抛接球-玩球标识 MAX_HURT= 19, -- BOSS攻击最高伤害 BOSS_TIRED= 20, -- BOSS疲劳值 REWARD_BOSS_SUPPORT= 21, -- 协助标识 DUNGEON_GOD_DOUBLE_REWARD= 22, -- 唤神副本双倍奖励 GUILD_CSGR= 23, -- 社团本国团战 } function RoleVo:__init() end function RoleVo:__defineVar() return { _class_type = self, --_cid = self._id, _iid = _in_obj_ins_id, _use_delete_method = false, vo_type = SceneBaseType.Role, role_id = 0, --用户ID(int32) plat_name = "" , --平台名(string) server_id = 0 , --服ID(int16) name = "", --玩家名(string) sex = 0, --性别(int8) 男1女2 level = 100 , --等级(int16) pos_x = 0, --X像素坐标(int16) pos_y = 0, --Y像素坐标(int16) dsgt_id = 0, --用户称号ID(int32) grade_id = 0, --爵位id --dsgt_name = "", --用户称号名称 hp = 100, --当前hp(int32) maxHp = 100, --最大hp(int32) move_speed = 160, --玩家速度(int16) weapon = 0 , -- int:32 武器 cloth = 0, -- int:32 装备 career = 0, --角色(int8) --神将=1 、天君=2、罗刹=3 realm = 0, --国家(int8) warGroup = 0, --战斗分组(int8) total_title = 0, --称号总数 title_list = {}, --称号列表 -- horse_id = 801020100, --坐骑ID(int32),前期任务之类的飞行 is_ride = 0, -- 是否骑乘状态,0非,1是 horse_id = 0, --坐骑ID(int32),前期任务之类的飞行 pet_id = 0, -- 宠物ID pet_status = 0, -- 宠物标志位0隐藏1显示 pk_status = 1, --PK状态(int8) imageId = 0, --玩家形象(变身形象)(int32) vip_flag = 0, --Vip标识(int8) guild_id = 0, --社团ID(int32) guild_name = "", --社团名称(string) position = 0, --社团职位(int8) hide_flag = 0 , --是否不可见(int8) ghost_mode = 0, --幽灵状态(int8) fighting = 0, --战斗力(int32) dance_status = 0, --跳舞状态(int8) 0取消跳舞 1跳舞中 boss_flag = 0, --是否boss归属 0否 1是 team_id = 0, --队伍id 32 team_job = 0, --队伍职位(0 无 1队长 2队员) flag_state = 0, --旗子标识 0标示无 1红色旗子 prePoseState = PoseState.STAND, poseState = PoseState.STAND, battle_title = 0, --战场头衔(天空|旗子站) sky_flags = {}, --天空战场旗子 state_type = 0, --int:8 状态类型(0:无 1:补魔 2:被补魔 3:自我补魔) weapon_effect = 0, --装备附魔 birth_angle = 270, --出生角度 水平向右为0 逆时针一圈为360度 show_base_info_only = false, --nameBoard只显示名字和血条 --wing_id = 0, --翅膀 safe_area_state = 0, --1角色处于安全区域状态 2角色处于非安全区域状态 3角色切场景进入安全区域状态 hatred = 0, --罪恶值 is_marriage = 0, --婚姻状态(0单身 1恋爱 2已婚) wedding_state_flags = 0, --婚礼状态标识 parade_state_flags = 0, --巡游状态标识 marriage_id = 0, --伴侣id marriage_name = "", --伴侣名字 sprite_id = 0, --小精灵id baby_id = 0, --宝宝id child_follow_status = 0, --宝宝标志位0隐藏1显示 escort_state = 0, --护送id protect_time = 0, --保护时间 date_role_id = 0, pokemon_id = 0, --宠物id pokemon_star = 0, --宠物阶数 activity_flags = {}, --活动标识 casual_state_flags = 0, --海滩休闲 is_fishing_flag = 0, --钓鱼状态标识 deity_id = 0, turn = 0, --转生 mate_name = "", --羁绊相关 mate_title = "", --羁绊相关 mate_lv = 0, --羁绊称号显示等级 guild_contribute = 0, --社团贡献 honor = 0, --名望券 pet_wing_id = 0, pet_weapon_id = 0, pet_farmour = 0, action_energy = 0, --当前行动能量 max_action_energy = 0, --行动能量最大值 god_id = 0, --式神id god_hp = 0, --式神血量 god_max_hp = 0, --式神血量上限 money_boss_protect_time = 0, --赏金boss保护时间戳 deserted_boss_protect_time = 0, --星域boss保护时间戳 } end function RoleVo:ResetData() self.horse_id = 0 self.money_boss_protect_time = 0 self.deserted_boss_protect_time = 0 end --[[ int:64 用户ID string 平台(显示用) int:16 第几服(显示用) string 服务器名称(显示用) figure 形象 int:16 X坐标 int:16 Y坐标 int:32 hp int:32 hp_lim int:16 玩家速度 ]] function RoleVo:ReadFromProtocal( ) self.role_id, self.plat_name, self.server_id, self.server_num = UserMsgAdapter_ReadFmt("lshh") FigureProtoVo.ReadFmt(self) local team_id local len self.pos_x, self.pos_y, self.hp, self.maxHp, self.move_speed, -- self.att_speed, --攻击速度 self.hide_flag, --是否不可见(int8) self.ghost_mode, --幽灵状态(int8) self.warGroup, --战斗分组 self.boss_flag, team_id, self.team_job, self.pk_status, self.fighting, self.is_ride_wait_delete,--待删参数,放figure了 self.horse_id, self.hatred, self.pet_id, self.pet_status, self.protect_time, self.date_role_id, len = UserMsgAdapter_ReadFmt2("hhllhcclclccicihicilh") self.activity_flags = {} for i = 1, len do local obj = {} obj.key = UserMsgAdapter_ReadFmt("c") obj.value = UserMsgAdapter_ReadFmt("l") table.insert(self.activity_flags, obj) end self.mate_name = UserMsgAdapter_ReadFmt("s")--羁绊对象 self.mate_title = UserMsgAdapter_ReadFmt("s")--羁绊称号 self.dance_status = UserMsgAdapter_ReadFmt("c")--跳舞状态 self.mate_lv = UserMsgAdapter_ReadFmt("c")--羁绊称号显示等级 self.god_id = UserMsgAdapter_ReadFmt("h") --式神id self.god_hp = UserMsgAdapter_ReadFmt("l")--式神血量 self.god_max_hp = UserMsgAdapter_ReadFmt("l")--式神血量上限 self.money_boss_protect_time = UserMsgAdapter_ReadFmt("i")--赏金boss保护时间戳 self.deserted_boss_protect_time = UserMsgAdapter_ReadFmt("i")--星域boss保护时间戳 -- print("self.pet_status=",self.pet_status) -- print("protect_time=",self.protect_time) -- print("date_role_id=",self.date_role_id,self.name) -- print("escort_state=", self.escort_state) -- print("===self.horse_id,self.hatred",self.horse_id,self.hatred,self.pet_id,self.name) -- print("战斗分组------------=", team_id,self.name, self.warGroup, self.pos_x, self.pos_y, self.hp, self.maxHp, self.ghost_mode) self:ChangeVar("team_id", team_id) self:ChangeVar("mate_title", self.mate_title) -- print("婚姻", self.is_marriage, self.marriage_id, self.marriage_name) -- print("boss_flag", self.boss_flag) ------------------------- --进阶部分 self:RefreshFosterData() --进阶部分 ------------------------- end --[[ int:32 ID string 平台(显示用) int:16 第几服(显示用) figure 形象 int:16 X坐标 int:16 Y坐标 int:32 hp int:32 hp_lim int:16 速度 int:16 攻击速度 int:8 是否隐身(0否,1是) int:8 是否幽灵(0否, 1是) int:16 分组id ]] function RoleVo:ReadFakeProtacal() self.role_id, self.plat_name, self.server_id = UserMsgAdapter_ReadFmt("ish") FigureProtoVo.ReadFmt(self) self.pos_x, self.pos_y, self.hp, self.maxHp, self.move_speed, -- self.att_speed, --攻击速度 self.hide_flag, --是否不可见(int8) self.ghost_mode, --幽灵状态(int8) self.warGroup, self.fighting, self.dance_status, self.server_num = UserMsgAdapter_ReadFmt2("hhllhcclich") --战斗分组 print("假人数据------------=",self.name,self.role_id, self.pos_x, self.pos_y, self.hp, self.maxHp, self.ghost_mode, self.warGroup) self.is_fake_role = true --是否假人 纯服务端控制的假人 if SceneManager:getInstance():IsGodDungeon() then self.name = GetCSLongName(self.name,self.server_num) end ------------------------- --主角假人,暂时先用名字判断 if self.name == RoleManager.Instance.mainRoleInfo.name then self.is_fake_main_role = true end ------------------------- --随机名字 if self.name == "" then self.name = LoginModel:getInstance():GetRandomRoleName(self.sex, true) end ------------------------- --进阶部分 self:RefreshFosterData() --进阶部分 ------------------------- end --处理进阶部分数据 function RoleVo:RefreshFosterData( ) local sprite_res_id = 0--法宝 local pet_res_id = 0--AI娘 local pet_wing_id = 0--ai娘翅膀 local horse_id = 0--ai娘翅膀 local wing_id = 0 local pet_weapon_id = 0 local pet_farmour = 0 local function get_foster_skin( type_id ) for k,v in pairs(self.foster_skin_list) do if v.type_id == type_id and v.skin_id > 0 then return v.skin_id end end for k,v in pairs(self.foster_sub_skin_list) do if v.type_id == type_id and v.skin_id > 0 then return v.skin_id end end end for k,v in pairs(self.foster_list) do if v.type_id == FosterConst.ModuleId.FPearl then sprite_res_id = get_foster_skin(v.type_id) or FosterModel:GetInstance():GetModuleResIdByStage(v.type_id,v.stage_id) elseif v.type_id == FosterConst.ModuleId.FJarvis then pet_res_id = get_foster_skin(v.type_id) or FosterModel:GetInstance():GetModuleResIdByStage(v.type_id,v.stage_id) elseif v.type_id == FosterConst.ModuleId.FCloud then pet_wing_id = get_foster_skin(v.type_id) or FosterModel:GetInstance():GetModuleResIdByStage(v.type_id,v.stage_id) elseif v.type_id == FosterConst.ModuleId.FHorse then horse_id = get_foster_skin(v.type_id) or FosterModel:GetInstance():GetModuleResIdByStage(v.type_id,v.stage_id) elseif v.type_id == FosterConst.ModuleId.FWing then wing_id = get_foster_skin(v.type_id) or FosterModel:GetInstance():GetModuleResIdByStage(v.type_id,v.stage_id) elseif v.type_id == FosterConst.ModuleId.FGun then pet_weapon_id = get_foster_skin(v.type_id) or FosterModel:GetInstance():GetModuleResIdByStage(v.type_id,v.stage_id) elseif v.type_id == FosterConst.ModuleId.FArmour then pet_farmour = get_foster_skin(v.type_id) or FosterModel:GetInstance():GetModuleResIdByStage(v.type_id,v.stage_id) end end self:ChangeVar("sprite_id",sprite_res_id) self:ChangeVar("pet_id",pet_res_id) self:ChangeVar("pet_wing_id",pet_wing_id) self:ChangeVar("horse_id",horse_id) self:ChangeVar("wing_id",wing_id) self:ChangeVar("pet_weapon_id",pet_weapon_id) self:ChangeVar("pet_farmour",pet_farmour) self:ChangeVar("is_ride",self.is_ride) end --取等级模型id列表的衣服id --scene_obj_type 是否是场景对象 还是ui对象 function RoleVo:GetRoleClotheId(scene_obj_type) if scene_obj_type and self:CheckIsGod() then local cfg = Config.God[self.god_id] if cfg then return cfg.resource end end local model_res_list = self.level_model_list if model_res_list then for k,v in ipairs(model_res_list) do if v.part_pos == FashionPartPos.Clothe then return v.level_model_id end end end end --取时装衣服贴图id function RoleVo:GetRoleClotheTextureId(scene_obj_type) -- if RoleVo.IsModelLimit(self) then -- return -- end -- if scene_obj_type and self:CheckIsGod() then -- return nil -- end local model_res_list = self.fashion_model_list if model_res_list then for k,v in ipairs(model_res_list) do if v.part_pos == FashionModel.FashionType.CLOTHES then --需要折算返回资源id local id = v.fashion_model_id if id < 1000 then id = id + self.career * 1000 end if v.fashion_chartlet_id > 1 then--配色大于1的要多连接一个配色 id = id .. v.fashion_chartlet_id end return tonumber(id), 0 end end end end --取时装头饰贴图id --block是否屏蔽时装头饰 --目前来看 好像头发必须有 所以上面的block无效 总不能光头吴克吧 --发饰 也就是帽子在下面获取 function RoleVo:GetRoleHeadId(block) local model_res_list if not block then model_res_list = not block and self.fashion_model_list or nil if model_res_list then for k,v in ipairs(model_res_list) do if v.part_pos == FashionModel.FashionType.HEAD then --需要折算返回资源id local id = v.fashion_model_id if id < 1000 then id = id + self.career * 1000 end if v.fashion_chartlet_id > 1 then--配色要多连接一个后缀 id = id .. v.fashion_chartlet_id end return tonumber(id) end end end end --没找到时装就用默认头发 model_res_list = self.level_model_list if model_res_list then for k,v in ipairs(model_res_list) do if v.part_pos == FashionPartPos.Head then return v.level_model_id end end end end function RoleVo:GetRoleWingId( block ) -- if RoleVo.IsModelLimit(self) then -- return -- end --珍宝 if self.foster_skin_list then for k,v in pairs(self.foster_skin_list) do if v.type_id == FosterConst.ModuleId.FWing and v.skin_id and (v.skin_id > 0) then return v.skin_id end end end --时装 if self.fashion_model_list then for k,v in ipairs(self.fashion_model_list) do if v.part_pos == FashionModel.FashionType.WING then return v.fashion_model_id end end end --基础进阶 if self.foster_list then for k,v in pairs(self.foster_list) do if v.type_id == FosterConst.ModuleId.FWing then self.wing_id = FosterModel:GetInstance():GetModuleResIdByStage(v.type_id,v.stage_id) end end end --进阶 if self.wing_id and self.wing_id > 0 then return self.wing_id else if self.level_model_list then for k,v in ipairs(self.level_model_list) do if v.part_pos == FashionPartPos.wing then return v.level_model_id end end end end end --取时装发饰贴图id --block是否屏蔽时装=发饰 function RoleVo:GetRoleHatId(block) -- if RoleVo.IsModelLimit(self) then -- return -- end local model_res_list = not block and self.fashion_model_list or nil if model_res_list then for k,v in ipairs(model_res_list) do if v.part_pos == FashionModel.FashionType.HAT then return v.fashion_model_id end end end end --取足迹的id function RoleVo:GetRoleFootmarkId() do return end--还没足迹 时装列表里面没有你要的东西 别来这遍历了 if RoleVo.IsModelLimit(self) then return end local model_res_list = self.fashion_model_list if model_res_list then for k,v in ipairs(model_res_list) do if v.part_pos == FashionPartPos.Footmark then return v.fashion_model_id end end end end --block: 1屏蔽时装 2 屏蔽神兵 --先去时装模型列表的 再取等级模型id列表的武器id function RoleVo:GetWeaponClotheId(scene_obj_type,block) local model_res_list if self.role_id == RoleManager:getInstance():GetMainRoleId() then if FosterModel:GetInstance():GetShowHideType( FosterConst.ModuleId.FWeapon ) then if FosterConst.DefaultWeaponId[RoleManager.Instance.mainRoleInfo.career] then return FosterConst.DefaultWeaponId[RoleManager.Instance.mainRoleInfo.career] end end end --皮肤 if self.foster_sub_skin_list then for k,v in pairs(self.foster_sub_skin_list) do if v.type_id == FosterConst.ModuleId.FWeapon and v.skin_id and (v.skin_id > 0) then return v.skin_id end end end --珍宝 if self.foster_skin_list then for k,v in pairs(self.foster_skin_list) do if v.type_id == FosterConst.ModuleId.FWeapon and v.skin_id and (v.skin_id > 0) then return v.skin_id end end end --时装 if not block then model_res_list = (not block or block ~= 2) and self.fashion_model_list or nil if model_res_list then for k,v in ipairs(model_res_list) do if v.part_pos == FashionModel.FashionType.WEAPON then --需要折算返回资源id local id = v.fashion_model_id if id < 1000 then id = id + self.career * 1000 end return tonumber(id) end end end end --进阶 model_res_list = self.level_model_list if model_res_list then for k,v in ipairs(model_res_list) do if v.part_pos == FashionPartPos.Weapon then return v.level_model_id end end end end --更新等级模型数据 function RoleVo:UpdateLevelModelList(part_pos, value) local model_res_list = self.level_model_list if model_res_list then for k,v in ipairs(model_res_list) do if v.part_pos == part_pos then v.level_model_id = tonumber(value) elseif v.part_pos == part_pos then v.level_model_id = tonumber(value) end end end end function RoleVo:CheckIsGod() return self.god_id > 0 end --获取相应标志 -- 活动类型 17羁绊小游戏 function RoleVo:GetFlagsByKey(key) local value = 0 if self.activity_flags then for i,v in pairs(self.activity_flags) do if v.key == key then value = v.value break end end end return value end -- 判断活动标志是否存在 function RoleVo:ExitFlag(key) local bool = false if self.activity_flags then for i,v in pairs(self.activity_flags) do if v.key == key then bool = true break end end end return bool end function RoleVo:__delete() end --外观限制,部分多人玩法只需显示基础外观 function RoleVo:IsModelLimit( ) if self.role_id == RoleManager:getInstance():GetMainRoleId() then return false end if SceneManager then if SceneManager:getInstance():IsFullEffectScene() then return false end if SceneManager:getInstance():IsModelLimited() then return true end end return false end