SceneDropObj = SceneDropObj or BaseClass(EventDispatcher)
|
|
local SceneDropObj = SceneDropObj
|
|
local GameMath_GetDistance = GameMath.GetDistance
|
|
|
|
function SceneDropObj:__init()
|
|
|
|
self.obj_type = SceneBaseType.Drop
|
|
self.drop_mgr = SceneDropManager:getInstance()
|
|
self.guild_model = GuildModel:getInstance()
|
|
self.scene_mgr = SceneManager:getInstance()
|
|
self.scene = Scene.getInstance()
|
|
|
|
self.nameboard_Manager = NameBoardManager.getInstance()
|
|
self.nameboard_index = false
|
|
self.name_board = false
|
|
self.not_fly_float = false--不需要飞飘字
|
|
|
|
--根父容器
|
|
|
|
-- local view_path = "root/Canvas/SceneDropObj"
|
|
-- local go = GameObject.Find(view_path)
|
|
-- if go then
|
|
-- local item = newObject(go)
|
|
-- item.gameObject:SetActive(true)
|
|
-- self.gameObject = item.gameObject
|
|
-- item.transform:SetParent(panelMgr:GetParent("SceneObjContainer").transform)
|
|
-- item.transform.localScale = Vector3.one
|
|
-- item.transform.localPosition = Vector3.zero
|
|
-- end
|
|
|
|
self.gameObject = UiFactory.createChild(panelMgr:GetParent("SceneObjContainer").transform,UIType.SceneDropObj) --先用uifactory来创建该容器吧 日后再调整
|
|
self.transform = self.gameObject.transform
|
|
|
|
self.item_parent = self.transform:Find("ItemCon")
|
|
self.effect_parent = self.transform:Find("EffectCon")
|
|
self.obj_parent = self.transform:Find("ItemCon/obj").transform
|
|
self.item_icon_con = self.transform:Find("ItemCon/Icon").gameObject
|
|
self.item_parent.localScale = Vector3.one * SceneModelScale
|
|
self.icon_render = self.item_icon_con:GetComponent("SpriteRenderer")
|
|
|
|
self.animator = self.item_parent.gameObject:GetComponent("Animator")
|
|
|
|
self.effect_parent.localPosition = Vector3(0,-0.1,0)
|
|
self.obj_parent.localPosition = Vector3(0,-0.1,0)
|
|
--特效数组
|
|
self.particle_list = {}
|
|
self.max_scale = 1
|
|
self.create_time = 0 --记录掉落创建时间
|
|
self.every_time = 30 --多少秒后其他人可以拾取归属掉落
|
|
self.state = 0 -- 1 作为抛物线 2 静止地面 3 等待发送协议 4 缩小 5 飞到角色身上 5 从角色身上飞到背包 9 变透明 10抛物线之后的第二个动画
|
|
self.step_start_time = 0 -- 步骤的开始时间
|
|
self.can_not_pick = false --服务端返回掉落不能拾取,就标记一下
|
|
self.last_pick_time = 0 --捡取时间
|
|
self.sound_id = 0
|
|
self.no_smooth_height = true
|
|
self.effect_gameObject = false
|
|
self.drop_model_gameObject = false
|
|
self.add_effect_type = 0 -- 1通过缓存 2 通过接口
|
|
self.scene = Scene.Instance
|
|
self.res_use_ref = {}
|
|
self:InitEvents()
|
|
end
|
|
|
|
function SceneDropObj:GetDropVo()
|
|
return self.vo
|
|
end
|
|
|
|
|
|
function SceneDropObj:InitEvents()
|
|
local function onCanNotPickSceneDropItem(drop_id)
|
|
--标记为不能拾取, 自动挂机不去捡, 但手动走过去还是会捡的
|
|
if self.drop_id == drop_id then
|
|
self.can_not_pick = true
|
|
self.state = 2
|
|
end
|
|
end
|
|
self.can_not_pick_up_id = GlobalEventSystem:Bind(SceneEventType.CAN_NOT_PICK_SCENE_DROP_ITEM, onCanNotPickSceneDropItem)
|
|
|
|
local function onPickSceneDropItem(vo)
|
|
if self.drop_id == vo.drop_id then
|
|
self.can_pick = true
|
|
end
|
|
end
|
|
self.pick_up_id = GlobalEventSystem:Bind(SceneEventType.PICK_SCENE_DROP_ITEM, onPickSceneDropItem)
|
|
|
|
--掉落消失,相对于其他队友 --所有的人都会收到
|
|
local function onDismissDropItem(drop_id)
|
|
local onCall = function ( )
|
|
if self.drop_id == drop_id and not self:IsPicking() then
|
|
self.step_start_time = Status.NowTime
|
|
self.state = 9
|
|
end
|
|
end
|
|
if SceneManager.Instance:IsBossMoneyScene() then
|
|
onCall()
|
|
else
|
|
setTimeout(onCall, 0.5) --15053返回后再判断是否被自己拾取,如果是则不消失,进入状态4
|
|
end
|
|
end
|
|
self.dismiss_item_id = GlobalEventSystem:Bind(SceneEventType.DISMiSS_SCENE_DROP_ITEM, onDismissDropItem)
|
|
|
|
-- 社团boss拾取特殊处理相关逻辑
|
|
-- 社团boss开始进入拾取进度
|
|
-- local function onStartPickGBossDrop(vo)
|
|
-- if vo.drop_id == self.drop_id then
|
|
-- local function delay_finish_pick()
|
|
-- if self.drop_id and self.state == 2 or self.state == 3 then
|
|
-- self.guild_model:Fire(GuildModel.PICK_UP_BOSS_DROP_ITEM, GuildModel.GBossPickOpty.Succeed, self.vo.drop_id)
|
|
-- end
|
|
-- end
|
|
-- self:CancelGuildBossPickDelayId()
|
|
|
|
-- self.gboss_pickup_delay_id = setTimeout(delay_finish_pick, 3 + 1) -- 多延迟1秒,方便采集界面的效果表现完整
|
|
-- end
|
|
-- end
|
|
-- self.on_start_pick_gboss_drop_id = GlobalEventSystem:Bind(SceneEventType.GBOSS_PICK_START, onStartPickGBossDrop)
|
|
-- 社团boss假采集中断
|
|
-- local function onCancelGbossPick(drop_id)
|
|
-- if self.drop_id == drop_id then
|
|
-- self:CancelGuildBossPickDelayId()
|
|
|
|
-- self.guild_model:Fire(GuildModel.PICK_UP_BOSS_DROP_ITEM,GuildModel.GBossPickOpty.Cancel, self.vo.drop_id)
|
|
-- end
|
|
-- end
|
|
-- self.on_cancel_gboss_pick = GlobalEventSystem:Bind(SceneEventType.GBOSS_PICK_CANCEL, onCancelGbossPick)
|
|
|
|
local function onRefeshDropItem()
|
|
if self.gboss_need_refresh then
|
|
self:InitDropVo(self.vo, self.center_x, self.center_y)
|
|
self.gboss_need_refresh = false
|
|
end
|
|
end
|
|
self.need_refresh_boss_info = self.guild_model:Bind(GuildModel.UPDATE_GUILD_BOSS_INFO, onRefeshDropItem)
|
|
end
|
|
|
|
function SceneDropObj:InitDropVo(vo,center_x,center_y)
|
|
self.vo = vo
|
|
self.center_x = center_x
|
|
self.center_y = center_y
|
|
self.drop_id = vo.drop_id
|
|
self.compress_id = Scene.CompressObjId(SceneBaseType.Drop, self.drop_id)
|
|
self.can_pick = vo.can_pick or false --是否能捡起,只有推送 15053 才能自己捡起 -- 遗忘之境默认自己能捡起来
|
|
self.fake_pick = vo.fake_pick or false--假掉落或直接拾取
|
|
-- 这个变量的作用是保证在社团场景中能等社团boss协议数据到达之后再次刷新掉落物品,防止掉落物信息和采集流程出错和重登掉落物的状态问题
|
|
self.gboss_need_refresh = false
|
|
local is_in_gboss_event = false
|
|
if self.scene_mgr:IsGuildScene() then
|
|
is_in_gboss_event = self.guild_model:GetSepcialPickLogicOfGBoss()
|
|
if not is_in_gboss_event then
|
|
self.gboss_need_refresh = true
|
|
end
|
|
end
|
|
if vo then
|
|
local goods_Id, lock = GoodsModel:getInstance():GetMappingTypeId(vo.drop_type, vo.type_id)
|
|
self.goods_basic = GoodsModel:getInstance():GetGoodsBasicByTypeId(goods_Id)
|
|
|
|
if self.goods_basic then
|
|
self.color = color or self.goods_basic.color or 1
|
|
local goods_icon = self.goods_basic.goods_icon
|
|
self.item_name = self.goods_basic.goods_name
|
|
if self.goods_basic.type == 11 and (self.goods_basic.subtype == 10 or self.goods_basic.subtype == 11)then --装备鉴定物, 碎片,显示鉴定物对应的装备图标
|
|
local type_id, _name, icon = EquipModel:getInstance():GetIdentifyGoodsNameAndIcon(self.goods_basic.type_id, RoleManager.Instance.mainRoleInfo.career, self.goods_basic.color)
|
|
goods_icon = icon
|
|
self.item_name = _name
|
|
end
|
|
if not self.nameboard_index then
|
|
self.nameboard_index,self.name_board = self.nameboard_Manager:CreateNameBoard()
|
|
end
|
|
|
|
if self.name_board then
|
|
self.name_board:SetGameObjectName(self.item_name)
|
|
self.name_board:SetGoodsConVisible(true)
|
|
self.name_board:SetGoodsName(Language.substitute("<color={0}>{1}</color>", WordManager.GetGoodsColor(self.goods_basic.color, true), Trim(self.goods_basic.goods_name)))
|
|
self.name_board:SetHpVisible(false)
|
|
end
|
|
|
|
local abName = ""
|
|
local resName = ""
|
|
local drop_icon = tonumber(vo.drop_icon) or 1
|
|
if not drop_icon or drop_icon == 0 then
|
|
abName = "model_dropmodel_" .. 1
|
|
resName = "model_dropmodel_" .. 1
|
|
else
|
|
abName = "model_dropmodel_" .. drop_icon
|
|
resName = "model_dropmodel_" .. drop_icon
|
|
end
|
|
local loadDropModelCallBack = function(objs)
|
|
if self.drop_model_gameObject then
|
|
destroy(self.drop_model_gameObject, true)
|
|
self.drop_model_gameObject = false
|
|
end
|
|
if self._use_delete_method then
|
|
return
|
|
end
|
|
if not objs or not objs[0] then
|
|
logWarn("cannot find drop res = "..drop_icon)
|
|
return
|
|
end
|
|
self.drop_model_gameObject = newObject(objs[0])
|
|
self.drop_model_gameObject:SetActive(true)
|
|
self.drop_model_gameObject.transform:SetParent(self.obj_parent)
|
|
self.drop_model_gameObject.transform.localPosition = Vector3.zero
|
|
self.drop_model_gameObject.transform.localRotation = Quaternion.identity
|
|
self.drop_model_gameObject.transform.localScale = Vector3.one
|
|
end
|
|
|
|
if self.obj_parent and abName and resName then
|
|
LuaResManager:getInstance():loadPrefab(self,abName,resName, loadDropModelCallBack, true)
|
|
end
|
|
-- print("Saber:SceneDropObj [165] self.vo.expire_time_stamp: ",self.vo.expire_time_stamp)
|
|
if self.vo.expire_time_stamp and self.vo.expire_time_stamp ~= 0 then
|
|
self:CancelTimer()
|
|
local free_loot_time = TimeUtil:getServerTime() + self.every_time -- 可以自由拾取的时间戳
|
|
local cur_time = TimeUtil:getServerTime()
|
|
local timer_func = function ()
|
|
cur_time = TimeUtil:getServerTime()
|
|
-- print("Saber:SceneDropObj [172] cur_time: ",cur_time)
|
|
if cur_time >= self.vo.expire_time_stamp then -- 道具超时,销毁
|
|
self:CancelTimer()
|
|
if not self.can_pick and self.state ~= 9 then
|
|
--消失
|
|
self.step_start_time = Status.NowTime
|
|
self.state = 9
|
|
end
|
|
elseif cur_time >= free_loot_time then
|
|
--变成可拾取状态
|
|
if not self.can_pick and self.state ~= 9 then
|
|
-- self:CancelTimer()
|
|
self.step_start_time = Status.NowTime
|
|
self.state = 2
|
|
end
|
|
end
|
|
end
|
|
if not self.timer then
|
|
self.timer = GlobalTimerQuest:AddPeriodQuest(timer_func, 1, -1)
|
|
end
|
|
else
|
|
self:CancelTimer()
|
|
end
|
|
end
|
|
|
|
self.create_time = Status.NowTime
|
|
self.step_start_time = Status.NowTime
|
|
|
|
if vo.no_anim then
|
|
self:SetRealPos(vo.pos_x,vo.pos_y)
|
|
self.state = 2
|
|
else
|
|
self:SetRealPos(vo.pos_x,vo.pos_y)
|
|
self.state = 10
|
|
self.animator:Play("drop_anim_1",-1,0.0)
|
|
self.animator:Update(0)
|
|
end
|
|
self:SetAlpha(1)
|
|
end
|
|
|
|
self:SetItemScale(self.max_scale)
|
|
self.effect_parent.gameObject:SetActive(false)
|
|
|
|
--添加物品光效
|
|
local onDelay = function ( )
|
|
self.effect_parent.gameObject:SetActive(true)
|
|
self:ClearShiquEffect()
|
|
local effect_res = self:GetColorEffect()
|
|
local gameObject = self.drop_mgr:GetObjFormPool(self,effect_res,effect_res)
|
|
if gameObject then
|
|
self.add_effect_type = 1
|
|
local gameObject_transform = gameObject.transform
|
|
gameObject_transform:SetParent(self.effect_parent)
|
|
SetLocalPosition(gameObject_transform,0,0,0)
|
|
SetLocalRotation(gameObject_transform)
|
|
self.effect_gameObject = gameObject
|
|
else
|
|
self.add_effect_type = 2
|
|
self.particle_id = ParticleManager:getInstance():AddTargetEffect( effect_res, self.compress_id, true, nil, nil, 7,nil,nil,1)
|
|
end
|
|
|
|
--播放声音
|
|
if self.vo.drop_type ~= 3 then
|
|
self:PlaySound("epicitem_drop")--Epicitem_drop
|
|
end
|
|
end
|
|
self:CancelDelayTimer()
|
|
|
|
-- 判断是否使用掉落物的光效特效
|
|
if (vo.effect and vo.effect~="") or is_in_gboss_event then
|
|
self.show_effect = true
|
|
self.timer_id = setTimeout(onDelay, 0.4)
|
|
end
|
|
|
|
if self.vo.drop_type == 3 then
|
|
self:PlaySound("gold_drop")
|
|
end
|
|
end
|
|
|
|
function SceneDropObj:CancelDelayTimer( )
|
|
if self.timer_id then
|
|
GlobalTimerQuest:CancelQuest(self.timer_id)
|
|
self.timer_id = nil
|
|
end
|
|
end
|
|
function SceneDropObj:PlaySound(res)
|
|
if not self:CanPlaySound() then
|
|
return
|
|
end
|
|
|
|
if lua_viewM.is_lock_screen then
|
|
return
|
|
end
|
|
|
|
if lua_soundM then
|
|
lua_soundM:StopEffect(self, LuaSoundManager.SOUND_TYPE.DROP, self.sound_id)
|
|
self.sound_id = lua_soundM:PlayEffect(self, res,false,LuaSoundManager.SOUND_TYPE.DROP)
|
|
end
|
|
end
|
|
|
|
function SceneDropObj:CancelTimer( )
|
|
if self.timer then
|
|
GlobalTimerQuest:CancelQuest(self.timer)
|
|
self.timer = nil
|
|
end
|
|
end
|
|
|
|
--主动添加挂在自己身上的例子特效
|
|
function SceneDropObj:AddParticle(id,particle_tranform)
|
|
particle_tranform.parent = self.effect_parent
|
|
SetLocalPosition(particle_tranform)
|
|
SetLocalScale(particle_tranform)
|
|
self.particle_list[id] = particle_tranform
|
|
end
|
|
--删除挂在自己身上的特效
|
|
--is_acive = false 被动删除挂在自己身上的粒子特效 由特效播放完来调用
|
|
--is_acive = true 主动删除挂在自己身上的特效 会通知particlemanager去删除 默认false
|
|
function SceneDropObj:RemoveParticle(id,is_acive)
|
|
self.particle_list[id] = nil
|
|
if is_acive then
|
|
ParticleManager:getInstance():DelEffect(id)
|
|
end
|
|
end
|
|
|
|
--主动删除挂在自己身上的所有粒子特效 通常是角色死亡 移除角色之类的
|
|
function SceneDropObj:RemoveAllParticle()
|
|
for id,_ in pairs(self.particle_list) do
|
|
ParticleManager:getInstance():DelEffect(id)
|
|
end
|
|
self.particle_list = {}
|
|
end
|
|
|
|
function SceneDropObj:Update(now_time, elapse_time)
|
|
if self.state == 10 then
|
|
self:DropFlyStep(now_time, elapse_time)
|
|
elseif self.state == 2 then
|
|
self:ExcuteStaticStep()
|
|
elseif self.state == 3 then
|
|
self:WaitForServerStep()
|
|
elseif self.state == 4 then
|
|
self:ScaleItemStep()
|
|
elseif self.state == 9 then
|
|
self:TransparentStep()
|
|
end
|
|
end
|
|
|
|
function SceneDropObj:__delete()
|
|
if self.pick_up_id then
|
|
GlobalEventSystem:UnBind(self.pick_up_id)
|
|
self.pick_up_id = nil
|
|
end
|
|
|
|
if self.dismiss_item_id then
|
|
GlobalEventSystem:UnBind(self.dismiss_item_id)
|
|
self.dismiss_item_id = nil
|
|
end
|
|
|
|
if self.fail_pick_up_id then
|
|
GlobalEventSystem:UnBind(self.fail_pick_up_id)
|
|
self.fail_pick_up_id = nil
|
|
end
|
|
|
|
if self.can_not_pick_up_id then
|
|
GlobalEventSystem:UnBind(self.can_not_pick_up_id)
|
|
self.can_not_pick_up_id = nil
|
|
end
|
|
|
|
if self.nameboard_index then
|
|
self.nameboard_Manager:RemoveNameBoard(self.nameboard_index)
|
|
self.nameboard_index = nil
|
|
end
|
|
|
|
if self.name_board then
|
|
self.name_board:DeleteMe()
|
|
self.name_board = nil
|
|
end
|
|
|
|
self:ClearShiquEffect()
|
|
self:RemoveAllParticle()
|
|
self:CancelTimer()
|
|
self:CancelDelayTimer()
|
|
lua_resM:clearReference(self.res_use_ref)
|
|
lua_resM:clearReference(self)
|
|
|
|
if self.drop_model_gameObject then
|
|
destroy(self.drop_model_gameObject, true)
|
|
self.drop_model_gameObject = false
|
|
end
|
|
|
|
if self.gameObject then
|
|
destroy(self.gameObject, true)
|
|
self.gameObject = nil
|
|
end
|
|
end
|
|
|
|
function SceneDropObj:Show()
|
|
return self.gameObject:SetActive(true)
|
|
end
|
|
|
|
function SceneDropObj:Hide()
|
|
self.show_effect = false
|
|
self.item_parent.localPosition = Vector3.zero
|
|
if self.gameObject.activeSelf and self.vo.fake_pick then--如果是假掉落 要拾取到背包
|
|
local type_id = GoodsModel:getInstance():GetMappingTypeId(self.vo.drop_type, self.vo.type_id)
|
|
local goods_list = {type_id}
|
|
MainUIModel:getInstance():PlayGoodsFlyList(goods_list)
|
|
if not self.not_fly_float then
|
|
local float_list = {{goods_type_id = type_id,num = self.vo.drop_num}}
|
|
MainUIModel:getInstance():AddFloatInfo(float_list,true)
|
|
end
|
|
end
|
|
return self.gameObject:SetActive(false)
|
|
end
|
|
|
|
|
|
function SceneDropObj:GetState()
|
|
return self.state
|
|
end
|
|
|
|
function SceneDropObj:SetRealPos(posx, posy)
|
|
if self.real_pos == nil then
|
|
self.real_pos = co.TableXY(posx,posy)
|
|
else
|
|
self.real_pos.x = posx
|
|
self.real_pos.y = posy
|
|
end
|
|
|
|
self:UpdateModelPos(self.real_pos.x,self.real_pos.y) --更新位置到模型
|
|
end
|
|
|
|
function SceneDropObj:GetRealPos()
|
|
return self.real_pos.x, self.real_pos.y
|
|
end
|
|
|
|
function SceneDropObj:UpdateModelPos(posx, posy)
|
|
if self.transform and not IsNull(self.transform) then
|
|
local newHeight = self.scene:GetZoneHeight(posx/SceneObj.LogicRealRatio.x,posy/SceneObj.LogicRealRatio.y)
|
|
--newHeight = newHeight + 0.7 --这里图片是中心点对其 所以要加上一半图片高度 图片是 74 像素
|
|
SetGlobalPosition3D(self.transform,posx/MainCamera.PixelsToUnits, posy/MainCamera.PixelsToUnits,SceneObjHeight.Obj + newHeight)
|
|
if self.name_board then
|
|
self.name_board:UpdatePos(posx, posy,SceneObjHeight.Obj + newHeight - 0.8)
|
|
end
|
|
end
|
|
end
|
|
|
|
function SceneDropObj:SetItemScale(scale)
|
|
if scale > self.max_scale then
|
|
scale = self.max_scale
|
|
end
|
|
self.item_parent.localScale = Vector3.one * scale * SceneModelScale
|
|
end
|
|
|
|
|
|
--设置身体的位置 真实坐标不变
|
|
function SceneDropObj:SetBodyXY(x,y)
|
|
if self.item_parent.transform then
|
|
SetLocalPosition(self.item_parent.transform, x / MainCamera.PixelsToUnits,y / MainCamera.PixelsToUnits,0)
|
|
end
|
|
if self.effect_parent.transform then
|
|
SetLocalPosition(self.effect_parent.transform, x / MainCamera.PixelsToUnits,y / MainCamera.PixelsToUnits,0)
|
|
end
|
|
end
|
|
|
|
function SceneDropObj:DropFlyStep()
|
|
if self.state == 10 then
|
|
local t = Status.NowTime - self.step_start_time
|
|
if t > 0.5 then
|
|
self.step_start_time = Status.NowTime
|
|
self.state = 2
|
|
end
|
|
end
|
|
end
|
|
|
|
function SceneDropObj:ExcuteStaticStep()
|
|
if self.state == 2 then
|
|
if self.can_pick == true then
|
|
self.state=4 --野外掉落,服务端先通知已经捡了,这里播放完抛物线后直接进入4,掉落消失
|
|
return
|
|
end
|
|
local t = Status.NowTime - self.step_start_time
|
|
|
|
local role_pos_x,role_pos_y
|
|
local role_list = {} --守护或者人物都可以捡,所以用列表去判断
|
|
local main_role = self.scene:GetMainRole()
|
|
if not main_role then
|
|
return
|
|
end
|
|
|
|
table.insert(role_list, main_role) --主角
|
|
|
|
if not self.scene.only_main_role_pick and ItemUseModel:getInstance():HasWearEvil() and not self.guild_model:GetSepcialPickLogicOfGBoss() then
|
|
if main_role and main_role.evil then
|
|
table.insert(role_list, main_role.evil) --守护
|
|
end
|
|
end
|
|
|
|
if #role_list > 0 then
|
|
-- local role_pos_x,role_pos_y = role:GetRealPos()
|
|
for i,role in ipairs(role_list) do
|
|
role_pos_x,role_pos_y = role:GetRealPos()
|
|
local distance = GameMath_GetDistance(role_pos_x, role_pos_y, self.real_pos.x, self.real_pos.y,false)
|
|
if t > 0.05 and distance < 75*75 then
|
|
if self.fake_pick then
|
|
if distance < 1000 then
|
|
self.state = 4
|
|
GlobalEventSystem:DelayFire(EventName.EVIL_AUTO_PICK)
|
|
return
|
|
end
|
|
end
|
|
self.step_start_time = Status.NowTime
|
|
--发送协议
|
|
if self.vo and not self.fake_pick then
|
|
local time = Status.NowTime-self.last_pick_time
|
|
if (self.vo.role_id == nil or self.vo.role_id == 0 or self.vo.role_id == RoleManager.Instance:GetMainRoleId()
|
|
or self:IsOutTime() ) and time>2 then
|
|
--社团boss击杀后5分钟内执行特殊拾取逻辑(模拟采集逻辑)
|
|
if self.guild_model:GetSepcialPickLogicOfGBoss() then
|
|
if role:IsInState(PoseState.MOVE) or role:IsInState(PoseState.JUMP) or (not role.GetIsCollecting or role:GetIsCollecting()) then
|
|
|
|
else
|
|
self.guild_model:Fire(GuildModel.PICK_UP_BOSS_DROP_ITEM, GuildModel.GBossPickOpty.Start, self.vo.drop_id)
|
|
--如果是守护,则去重新检测,是否有东西可以拾取
|
|
break
|
|
end
|
|
else
|
|
self.last_pick_time = Status.NowTime
|
|
--如果处于一键拾取状态就不要协议拾取了
|
|
--如果在拾取的过程中,切换了场景,那就不发协议了(守护有可能还在捡)
|
|
if not self.scene:IsInPickAllDropState() and self.vo.map_id == self.scene_mgr:GetSceneId() and not self.scene_mgr:IsReqChangeScene() then
|
|
GoodsModel:getInstance():Fire(GoodsModel.PICK_UP_SCENE_DROP_ITEM, self.vo.drop_id)
|
|
end
|
|
self.state = 3
|
|
GlobalEventSystem:DelayFire(EventName.EVIL_AUTO_PICK)
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
--超过15秒, 其他人可拾取归属掉落
|
|
function SceneDropObj:IsOutTime( )
|
|
return Status.NowTime-self.create_time>=self.every_time
|
|
end
|
|
|
|
--等待服务器返回
|
|
function SceneDropObj:WaitForServerStep()
|
|
if self.state == 3 then
|
|
local t = Status.NowTime - self.step_start_time
|
|
--有可能没有收到协议,那么十秒后就自动消失
|
|
if self.can_pick then
|
|
self.step_start_time = Status.NowTime
|
|
self.state = 4
|
|
end
|
|
if t > 200 then
|
|
self.step_start_time = Status.NowTime
|
|
self.state = 9
|
|
end
|
|
end
|
|
end
|
|
|
|
--飞到主角身上
|
|
function SceneDropObj:ScaleItemStep()
|
|
if self.state == 4 then
|
|
local t = Status.NowTime - self.step_start_time
|
|
local scale = self.max_scale - t / 0.4
|
|
if scale < 0 then
|
|
self.item_parent.gameObject:SetActive(false)
|
|
self:ClearShiquEffect()
|
|
self:ShowDropTip()
|
|
self.step_start_time = Status.NowTime
|
|
self.state = 7
|
|
end
|
|
--self:SetItemScale(scale)
|
|
end
|
|
end
|
|
|
|
--主角身上
|
|
function SceneDropObj:GetDropId()
|
|
return self.drop_id
|
|
end
|
|
|
|
--主角身上
|
|
function SceneDropObj:CanPlaySound()
|
|
return not self.no_anim
|
|
end
|
|
|
|
function SceneDropObj:IsFinishState()
|
|
return self.state == 7
|
|
end
|
|
|
|
function SceneDropObj:ReleaseObj()
|
|
self:Hide()
|
|
self:CancelTimer()
|
|
self:CancelDelayTimer()
|
|
self.last_pick_time = 0
|
|
self.no_anim = false
|
|
self.can_not_pick = false
|
|
self:ClearShiquEffect()
|
|
self.item_parent.gameObject:SetActive(true)
|
|
self.icon_render.sprite = nil
|
|
if self.nameboard_index then
|
|
self.nameboard_Manager:RemoveNameBoard(self.nameboard_index)
|
|
self.nameboard_index = nil
|
|
end
|
|
if self.name_board then
|
|
self.name_board:DeleteMe()
|
|
self.name_board = nil
|
|
end
|
|
lua_resM:clearReference(self.res_use_ref)
|
|
end
|
|
|
|
function SceneDropObj:ClearShiquEffect( )
|
|
local effect_res = self:GetColorEffect()
|
|
if self.particle_id then
|
|
|
|
ParticleManager:getInstance():DelEffectByResName(effect_res, self.compress_id)
|
|
self.particle_id = nil
|
|
end
|
|
if self.effect_gameObject and self.vo then
|
|
self.drop_mgr:AddObjToPool(self,effect_res,effect_res,self.effect_gameObject)
|
|
end
|
|
|
|
self.effect_gameObject = false
|
|
self.add_effect_type = 0
|
|
end
|
|
function SceneDropObj:ResetObj()
|
|
self:Show()
|
|
end
|
|
|
|
--state为2才能拾取,其他状态要么已拾取,要么还没播放抛物线
|
|
function SceneDropObj:IsCanPickUp()
|
|
if self.vo then
|
|
return (self.vo.role_id == 0 or self.vo.role_id == RoleManager.Instance:GetMainRoleId()
|
|
or self:IsOutTime() ) and (self.state==2 or self.state == 10) and not self.can_not_pick
|
|
end
|
|
return false
|
|
end
|
|
|
|
--是否为自己的掉落物
|
|
function SceneDropObj:IsSelfDrop()
|
|
if self.vo then
|
|
return self.vo.role_id == RoleManager.Instance:GetMainRoleId()
|
|
end
|
|
return false
|
|
end
|
|
|
|
--正在被拾取中
|
|
function SceneDropObj:IsPicking( )
|
|
return self.can_pick
|
|
end
|
|
|
|
--飞到主角身上
|
|
function SceneDropObj:TransparentStep()
|
|
if self.state == 9 then
|
|
local t = Status.NowTime - self.step_start_time
|
|
local alpha = 1 - t / 1
|
|
if alpha < 0 then
|
|
alpha = 0
|
|
self.state = 7
|
|
end
|
|
self:SetAlpha(alpha)
|
|
end
|
|
end
|
|
|
|
function SceneDropObj:SetAlpha(alpha)
|
|
if self.icon_render then
|
|
self.icon_render.color = Color(1,1,1,alpha)
|
|
end
|
|
end
|
|
|
|
function SceneDropObj:GetPickItemTip( )
|
|
|
|
local str = ""
|
|
if self.vo and self.item_name then
|
|
str = "获得 "..self.item_name .." x " .. self.vo.drop_num
|
|
end
|
|
|
|
return str
|
|
end
|
|
|
|
function SceneDropObj:ShowDropTip( )
|
|
|
|
-- local tip = self:GetPickItemTip()
|
|
-- if tip ~= "" then
|
|
-- Message.show(tip)
|
|
-- end
|
|
|
|
if self.vo and self.item_name then
|
|
local goods_id = 0
|
|
local drop_num = self.vo.drop_num
|
|
if self.vo.drop_type == 0 then --物品
|
|
goods_id = self.vo.type_id
|
|
elseif self.vo.drop_type == 3 then --金币
|
|
goods_id = GoodsModel:getInstance():GetMappingTypeId(self.vo.drop_type)
|
|
MainUIModel:getInstance():PlayGoodsFlyList({goods_id})
|
|
end
|
|
end
|
|
end
|
|
|
|
function SceneDropObj:CancelGuildBossPickDelayId( )
|
|
if self.gboss_pickup_delay_id then
|
|
TimerQuest.CancelQuest(GlobalTimerQuest,self.gboss_pickup_delay_id)
|
|
self.gboss_pickup_delay_id = nil
|
|
end
|
|
end
|
|
|
|
function SceneDropObj:GetColorEffect()
|
|
if not self.goods_basic then return "" end
|
|
local color = self.goods_basic.color
|
|
local effect_res = ""
|
|
if color == 5 then
|
|
effect_res = "droppillar_1"
|
|
elseif color == 4 then
|
|
effect_res = "droppillar_2"
|
|
elseif color == 3 then
|
|
effect_res = "droppillar_3"
|
|
end
|
|
return effect_res
|
|
end
|