--[[
|
|
服务器下发的怪物信息结构体
|
|
]]
|
|
MonsterVo = MonsterVo or BaseClass(BaseVo)
|
|
local MonsterVo = MonsterVo
|
|
|
|
local UserMsgAdapter_ReadFmt = UserMsgAdapter.ReadFmt
|
|
local UserMsgAdapter_ReadFmt2 = UserMsgAdapter.ReadFmt2
|
|
|
|
MonsterVo.Act_Flag = {
|
|
COLLECT = 1, --点击采集
|
|
SEAL = 2, --点击封印
|
|
}
|
|
|
|
function MonsterVo:__init()
|
|
end
|
|
function MonsterVo:__defineVar()
|
|
return {
|
|
_class_type = self,
|
|
--_cid = self._id,
|
|
_iid = _in_obj_ins_id,
|
|
_use_delete_method = false,
|
|
vo_type = SceneBaseType.Monster,
|
|
pos_x = 0, --X坐标(int16)
|
|
pos_y = 0 ,--Y坐标(int16)
|
|
instance_id = 0 , --怪物唯一标识(int32)
|
|
type_id = 0 , --怪物类型ID(int32)
|
|
hp = 100, --怪物当前血量(int32)
|
|
maxHp = 100 ,--怪物最大血量(int32)
|
|
level = 1, --怪物等级(int16)
|
|
name = "", --怪物名字(string)
|
|
move_speed = 160, --怪物速度(int16)
|
|
monster_res = 0 ,--怪物资源(int32)
|
|
effect_res = "", --特效资源(string)
|
|
texture_res = 0,
|
|
weapon_id = 0,
|
|
attack_mode = 0 ,--攻击类型(int8) 0:近战 1:远程
|
|
type = 0, --类型(int8) 0普通怪,1采集怪,2任务采集怪,3护送怪,4拾取怪,6进击怪,7塔防怪,9自动进击怪
|
|
quality = 0, --品级(int8) 0白/1绿/2蓝/3紫/4橙
|
|
guaji_flag = 0 ,--是否挂机(int8) 0是,1否
|
|
boss_type = 0 ,--Boss类型(int8) 0普通怪,1普通野外怪,2精英怪物,3赏金幻魔,4世界BOSS,5不死BOSS,6副本BOSS,7任务BOSS
|
|
pick_time = 0, --采集所需时间(int32)
|
|
master_id = 0, --主人ID(int32)
|
|
can_pick = 1 , --是否可点击(0否 1是)
|
|
can_attack = 1,--是否可攻击(0否 1是)
|
|
warGroup = 0 , --攻击阵营,默认0为无阵营
|
|
realm = 0 , --国家/阵营(1|2|3)
|
|
prePoseState = PoseState.STAND,
|
|
poseState = PoseState.STAND,
|
|
guild_id = 0,
|
|
role_id = 0,
|
|
birth_angle = nil,
|
|
five_element = 0,
|
|
title = 0,
|
|
protect_time = 0,--无敌特效消失时间
|
|
head_wear_id = 0,
|
|
head_wear_chartlet_id = 0,
|
|
career = 0,
|
|
-----------------------------一下是客户端战斗用到的属性------------------------------------------------------------------------
|
|
|
|
hide_flag = 0, --是否隐藏
|
|
ghost_mode = 0, --是否幽灵模式
|
|
}
|
|
end
|
|
|
|
function MonsterVo:ResetData()
|
|
-- self.pos_x = 0 --X坐标(int16)
|
|
-- self.pos_y = 0 --Y坐标(int16)
|
|
-- self.instance_id = 0 --怪物唯一标识(int32)
|
|
-- self.type_id = 0 --怪物类型ID(int32)
|
|
-- self.hp = 100 --怪物当前血量(int32)
|
|
-- self.maxHp = 100 --怪物最大血量(int32)
|
|
-- self.level = 1 --怪物等级(int16)
|
|
-- self.name = "" --怪物名字(string)
|
|
-- self.move_speed = 160 --怪物速度(int16)
|
|
-- self.monster_res = 0 --怪物资源(int32)
|
|
-- self.effect_res = "" --特效资源(string)
|
|
-- self.texture_res = 0
|
|
-- self.weapon_id = 0
|
|
-- self.attack_mode = 0 --攻击类型(int8) 0:近战 1:远程
|
|
-- self.type = 0 --类型(int8) 0普通怪,1采集怪,2任务采集怪,3护送怪,4拾取怪,6进击怪,7塔防怪,9自动进击怪
|
|
-- self.quality = 0 --品级(int8) 0白/1绿/2蓝/3紫/4橙
|
|
-- self.guaji_flag = 0 --是否挂机(int8) 0是,1否
|
|
-- self.boss_type = 0 --Boss类型(int8) 0普通怪,1普通野外怪,2精英怪物,3赏金幻魔,4世界BOSS,5不死BOSS,6副本BOSS,7任务BOSS
|
|
-- self.pick_time = 0 --采集所需时间(int32)
|
|
-- self.master_id = 0 --主人ID(int32)
|
|
-- self.can_pick = 1 --是否可点击(0否 1是)
|
|
-- self.can_attack = 1--是否可攻击(0否 1是)
|
|
-- self.warGroup = 0 --攻击阵营,默认0为无阵营
|
|
-- self.realm = 0 --国家/阵营(1|2|3)
|
|
-- self.prePoseState = PoseState.STAND
|
|
-- self.poseState = PoseState.STAND
|
|
-- self.guild_id = 0
|
|
-- self.birth_angle = nil
|
|
|
|
-- self.title = 0
|
|
self.owner_id = 0 --怪物所属玩家id
|
|
self.owner_name = "" --怪物所属玩家名字
|
|
self.cfg_data = nil
|
|
self.is_armor = 0 --是否霸体
|
|
self.icon_scale = 1
|
|
self.is_blood_bar = 1
|
|
self.color = 0
|
|
self.birth_angle = nil
|
|
self.birth_effect_res = nil --出生特效
|
|
self.foot_effect_res = nil--脚下特效
|
|
self.classification = nil --怪物分类名字
|
|
self.load_immediately = 0 --是否立即加载怪物
|
|
self.is_hit_ac = 0 --是否需要受击动作
|
|
|
|
self.is_hide_hp = nil
|
|
|
|
-- self.hide_flag = 0 --是否隐藏
|
|
-- self.ghost_mode = 0 --是否幽灵模式
|
|
end
|
|
|
|
--[[
|
|
int:16 X坐标
|
|
int:16 Y坐标
|
|
int:32 唯一标识
|
|
int:32 怪物ID
|
|
int:64 hp
|
|
int:64 hp_lim
|
|
int:16 等级
|
|
string 名字
|
|
int:16 速度
|
|
int:32 怪物资源
|
|
int: 8 0进战 1远程
|
|
int: 8 类型 0为怪物 1采集 2旗子 3护送车队
|
|
int: 8 0白/1绿/2蓝/3紫/4橙
|
|
int: 8 是否挂机:0是,1否
|
|
int: 8 BOSS类型 0普通怪,1野外BOSS,2宠物BOSS,3世界BOSS,4社团BOSS,5副本BOSS,6爬塔BOSS,7塔防BOSS
|
|
int:32 采集所需时间
|
|
int:8 是否可点击(0 不可点击, 1可点击)
|
|
int:8 是否可攻击(0 不可攻击, 1可攻击)
|
|
int:8 是否隐身(0否,1是)
|
|
int:8 是否幽灵(0否, 1是)
|
|
int:16 分组id
|
|
int:64 所属社团id
|
|
int:64 所属玩家id
|
|
]]
|
|
function MonsterVo:ReadFromProtocal()
|
|
local len
|
|
|
|
self.pos_x, --X坐标(int16)
|
|
self.pos_y, --Y坐标(int16)
|
|
self.instance_id, --怪物唯一标识(int32)
|
|
self.type_id, --怪物类型ID(int32)
|
|
self.hp, --怪物当前血量(int32)
|
|
self.maxHp, --怪物最大血量(int32)
|
|
self.level, --怪物等级(int16)
|
|
self.name, --怪物名字(string)
|
|
self.move_speed, --怪物速度(int16)
|
|
self.monster_res, --怪物资源(int32)
|
|
self.effect_res, --特效资源(string)
|
|
self.texture_res, --贴图id(int32)
|
|
self.weapon_id, --武器id(int32)
|
|
self.attack_mode, --攻击类型(int8) 0:近战 1:远程
|
|
self.type, --类型(int8) 0为怪物 1采集 2旗子 3护送车队
|
|
self.quality, --品级(int8) 0白/1绿/2蓝/3紫/4橙
|
|
self.guaji_flag, --是否挂机(int8) 0是,1否
|
|
self.boss_type, --Boss类型(int8) 0普通怪,1普通野外怪,2精英怪物,3本服BOSS,4跨服BOSS,5活动BOSS,6副本BOSS,7任务BOSS
|
|
self.pick_time, --采集所需时间(int32)
|
|
self.can_pick,
|
|
self.can_attack,
|
|
self.hide_flag, --是否不可见(int8)
|
|
self.ghost_mode, --幽灵状态(int8)
|
|
self.warGroup,
|
|
self.guild_id, --社团ID
|
|
self.role_id, --所属角色ID
|
|
self.birth_angle, --出生角度
|
|
self.owner_id, --怪物所属玩家id
|
|
self.owner_name, --怪物所属玩家名字
|
|
self.title,--头衔
|
|
self.protect_time, --PK保护结束时间搓
|
|
len = UserMsgAdapter_ReadFmt("hhiillhshisiicccccicccclllhlsiih")
|
|
self.activity_flags = {}
|
|
for i = 1, len do
|
|
local obj = {}
|
|
obj.key = UserMsgAdapter_ReadFmt("c")
|
|
obj.value = UserMsgAdapter_ReadFmt("i")
|
|
table.insert(self.activity_flags, obj)
|
|
end
|
|
|
|
self.buff_list = {}
|
|
local buff_num = UserMsgAdapter_ReadFmt("h")
|
|
for i = 1,buff_num do
|
|
buff = FightVo.initBuff()
|
|
buff.iconType, --int:16 类型
|
|
buff.buff_effect_id, --int:16 特效配置id
|
|
buff.id, --int:32 buff技能Id
|
|
buff.level, --int:8 buff技能等级
|
|
buff.diejia, --int:8 叠加数
|
|
buff.integer, --int:32 整数(有符号)
|
|
buff.decimals, --int:32 小数(有符号,显示时要除以1000)
|
|
buff.period = --int:64 到期unix时间戳, 客户端显示要用这个时间-服务端时间
|
|
UserMsgAdapter_ReadFmt2("hhiccIIl")
|
|
|
|
buff.decimals = UnsignToSigned(buff.decimals)
|
|
if self.buff_list[buff.iconType] == nil then
|
|
self.buff_list[buff.iconType] = {}
|
|
end
|
|
self.buff_list[buff.iconType][buff.id] = buff
|
|
end
|
|
|
|
self:SetBasePropertyFromConfig()
|
|
|
|
if self.boss_type == 3 or self.boss_type == 9 then
|
|
-- 根据boss类型设置脚底法阵
|
|
self.foot_effect_res = "effect_bossfazhen01"
|
|
elseif self.boss_type == 10 then --星域幻魔精英怪
|
|
self.foot_effect_res = "effect_bossfazhen02"
|
|
end
|
|
|
|
--武器根据职业显示不同模型
|
|
if self.type_id == GuideModel.WeaponMonster then
|
|
local career = RoleManager.Instance.mainRoleInfo.career
|
|
if career == 1 then
|
|
self.monster_res = 5010101
|
|
self.icon_scale = 10
|
|
self.birth_angle = 0
|
|
self.foot_effect_res = "effect_monster_caijiwuchangzhu01"
|
|
elseif career == 2 then
|
|
self.monster_res = 5110102
|
|
self.icon_scale = 10
|
|
self.birth_angle = 0
|
|
self.foot_effect_res = "effect_monster_caijiwuchangzhu01"
|
|
elseif career == 4 then
|
|
self.monster_res = 5010104
|
|
self.icon_scale = 10
|
|
self.birth_angle = 0
|
|
self.foot_effect_res = "effect_monster_caijiwuchangzhu01"
|
|
end
|
|
elseif self.type_id == 2300051 then -- 宝宝副本隐藏宝箱怪
|
|
BaseDungeonModel:getInstance():Fire(BaseDungeonModel.SHOW_BABYDUN_SPEICAL_TIP, self.type_id)
|
|
elseif self.type == MonsterType.CSGWAR then--跨国团战设置友军不可被点击
|
|
local my_group = RoleManager.Instance.mainRoleInfo.warGroup
|
|
local same_group = (my_group > 0 and my_group == self.warGroup)
|
|
self.can_pick = same_group and 0 or 1
|
|
end
|
|
|
|
-- print("创建怪物:",self.name, self.hp,self.maxHp, self.type_id, self.weapon_id, self.title, self.warGroup)
|
|
end
|
|
function MonsterVo:SetBasePropertyFromConfig()
|
|
self:CacheCfgData()
|
|
if self.cfg_data == nil then
|
|
return
|
|
end
|
|
self.is_armor=self.cfg_data.is_armor or 0 --是否霸体
|
|
--print("怪物资源缩放:", self.cfg_data.icon_scale, tonumber(self.cfg_data.icon_scale))
|
|
self.icon_scale = tonumber(self.cfg_data.icon_scale)
|
|
self.is_blood_bar = tonumber(self.cfg_data.is_blood_bar)
|
|
self.color = tonumber(self.cfg_data.color)
|
|
if self.birth_angle == 0 then
|
|
self.birth_angle = tonumber(self.cfg_data.direction)
|
|
if self.birth_angle == -1 then
|
|
self.birth_angle = nil
|
|
end
|
|
end
|
|
if Config.ConfigGuildWar.MonsterDirection[self.type_id] then
|
|
self.birth_angle = Config.ConfigGuildWar.MonsterDirection[self.type_id]
|
|
end
|
|
if Config.ConfigDungeonClient.monster_direction[self.type_id] then
|
|
self.birth_angle = Config.ConfigDungeonClient.monster_direction[self.type_id]
|
|
end
|
|
if Config.ConfigKFGuildWar.MonsterDirection[self.type_id] then
|
|
self.birth_angle = Config.ConfigKFGuildWar.MonsterDirection[self.type_id]
|
|
end
|
|
if self.type_id == Config.ConfigTaskEffect.MonsterSakuraTypeID then
|
|
self.birth_angle = 285
|
|
end
|
|
self.birth_effect_res = Trim(self.cfg_data.mon_state) or ""
|
|
self.classification = Trim(self.cfg_data.classification) or "" --怪物分类名字
|
|
self.load_immediately = tonumber(self.cfg_data.load_immediately) or 0 --是否立即加载怪物
|
|
self.is_hit_ac = tonumber(self.cfg_data.is_hit_ac) or 0 --是否需要受击动作
|
|
|
|
self.is_hide_hp = (self.cfg_data.is_hide_hp==1)
|
|
self.career = self.cfg_data.career or 1
|
|
self.head_wear_id = self.cfg_data.headwear_id or 0
|
|
self.head_wear_chartlet_id = self.cfg_data.headwear_texture or 0
|
|
-- print("怪物显示血条名字怪物显示血条名字", self.name, self.is_hide_hp, self.birth_angle == -1 , self.is_hit_ac, self.is_hit_ac ~= 0)
|
|
end
|
|
function MonsterVo:CacheCfgData()
|
|
if self.cfg_data == nil then
|
|
self.cfg_data = ConfigItemMgr.Instance:GetMonsterDataItem(self.type_id)
|
|
end
|
|
end
|
|
|
|
function MonsterVo:GetFashionTextureId()
|
|
if self.texture_res and tonumber(self.texture_res) ~= 0 then
|
|
return self.monster_res .. self.texture_res
|
|
end
|
|
end
|
|
|
|
function MonsterVo:GetRoleHeadId(block)
|
|
local show = not block
|
|
if show then
|
|
return self.head_wear_id,self.head_wear_chartlet_id
|
|
end
|
|
end
|
|
|
|
--获取相应标志
|
|
-- 活动类型 1:社团争霸 2:护送劫字 3:跨服社团战 4:婚礼 5:巡游 6 大乱斗
|
|
-- (0:原形象 1:冲车 2:炮车)
|
|
function MonsterVo: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
|