303 lines
7.4 KiB
Plaintext
303 lines
7.4 KiB
Plaintext
ScenePlayerRevive = class("ScenePlayerRevive", SubView);
|
|
|
|
ScenePlayerRevive.ExpelSkillSortId = 10151
|
|
|
|
local ReviveSkillSortIds = {161, 1389, 1438};
|
|
local _SkillProxy;
|
|
local Func_HaveReviveSkill = function ()
|
|
if(_SkillProxy == nil)then
|
|
_SkillProxy = SkillProxy.Instance;
|
|
end
|
|
for i=1,#ReviveSkillSortIds do
|
|
if(_SkillProxy:HasLearnedSkillBySort(ReviveSkillSortIds[i]))then
|
|
return true;
|
|
end
|
|
end
|
|
return false;
|
|
end
|
|
local Func_GetReviveSkill = function ()
|
|
if(_SkillProxy == nil)then
|
|
_SkillProxy = SkillProxy.Instance;
|
|
end
|
|
for i=1,#ReviveSkillSortIds do
|
|
local skill = _SkillProxy:GetLearnedSkillBySortID(ReviveSkillSortIds[i]);
|
|
if(skill)then
|
|
return skill;
|
|
end
|
|
end
|
|
return false;
|
|
end
|
|
|
|
local _MapManager;
|
|
|
|
function ScenePlayerRevive:Init()
|
|
_MapManager = Game.MapManager;
|
|
|
|
self.deadPlayerMap = {};
|
|
self.reviveEffectMap = {};
|
|
|
|
self:MapListenEvent();
|
|
|
|
end
|
|
|
|
function ScenePlayerRevive:GetReviveLeafItem()
|
|
local playerRelive = GameConfig.PlayerRelive;
|
|
if(playerRelive)then
|
|
local reviveLeafId = playerRelive.deathcost[1].id;
|
|
return BagProxy.Instance:GetItemByStaticID(reviveLeafId);
|
|
end
|
|
return nil;
|
|
end
|
|
|
|
function ScenePlayerRevive:GetReviveStoneItem()
|
|
local playerRelive = GameConfig.PlayerRelive;
|
|
if(playerRelive)then
|
|
local reviveStoneId = playerRelive.Skillcost[1].id;
|
|
return BagProxy.Instance:GetItemByStaticID(reviveStoneId);
|
|
end
|
|
return nil;
|
|
end
|
|
|
|
function ScenePlayerRevive:MapListenEvent()
|
|
self:AddDispatcherEvt(CreatureEvent.Player_CampChange, self.HandlePlayerCampChange);
|
|
|
|
self:AddListenEvt(PlayerEvent.DeathStatusChange, self.HandlePlayerStatusChange);
|
|
self:AddListenEvt(SceneUserEvent.SceneAddRoles, self.HandleAddRoles)
|
|
self:AddListenEvt(SceneUserEvent.SceneRemoveRoles, self.HandleRemoveRoles);
|
|
|
|
self:AddListenEvt(ItemEvent.ReviveItemAdd, self.UpdatePlayersReviveState);
|
|
self:AddListenEvt(ItemEvent.ReviveItemRemove, self.UpdatePlayersReviveState);
|
|
|
|
self:AddListenEvt(ServiceEvent.PlayerMapChange, self.UpdatePlayersReviveState);
|
|
end
|
|
|
|
function ScenePlayerRevive:HandleAddRoles( note )
|
|
local players = note.body;
|
|
if(players)then
|
|
for _,player in pairs(players)do
|
|
if(player)then
|
|
self:UpdatePlayerReviveState(player.data.id);
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function ScenePlayerRevive:HandleRemoveRoles( note )
|
|
local playerids = note.body;
|
|
if(playerids)then
|
|
for _,playerid in pairs(playerids)do
|
|
local effect = self.reviveEffectMap[playerid];
|
|
if(effect)then
|
|
effect:Destroy();
|
|
end
|
|
self.reviveEffectMap[playerid] = nil;
|
|
end
|
|
end
|
|
end
|
|
|
|
function ScenePlayerRevive:HandlePlayerCampChange(player)
|
|
if(player)then
|
|
self:UpdatePlayerReviveState(player.data.id);
|
|
end
|
|
end
|
|
|
|
function ScenePlayerRevive:HandlePlayerStatusChange(note)
|
|
local player = note.body;
|
|
|
|
if(player)then
|
|
self:UpdatePlayerReviveState(player.data.id);
|
|
end
|
|
end
|
|
|
|
function ScenePlayerRevive:UpdatePlayersReviveState()
|
|
for playerid,effect in pairs(self.deadPlayerMap) do
|
|
self:UpdatePlayerReviveState(playerid);
|
|
end
|
|
end
|
|
|
|
|
|
function ScenePlayerRevive._ReviveBySkill(playerid, reviveItem)
|
|
local player = NSceneUserProxy.Instance:Find(playerid);
|
|
if(not player)then
|
|
return;
|
|
end
|
|
|
|
if(player and player:IsDead())then
|
|
local skill = Func_GetReviveSkill();
|
|
local range = nil;
|
|
local skillInfo = Game.LogicManager_Skill:GetSkillInfo(skill.id)
|
|
if(skillInfo)then
|
|
range = skillInfo:GetLaunchRange(player);
|
|
end
|
|
Game.Myself:Client_AccessTarget(player, skill.id , nil, AccessCustomType.ReviveBySkill, range);
|
|
end
|
|
end
|
|
|
|
function ScenePlayerRevive._ReviveByLeaf(playerid, reviveItem)
|
|
local myRole = Game.Myself;
|
|
local player = NSceneUserProxy.Instance:Find(playerid);
|
|
if(not player)then
|
|
return;
|
|
end
|
|
MsgManager.ConfirmMsgByID(2508,function ()
|
|
local player = NSceneUserProxy.Instance:Find(playerid);
|
|
if(player and player:IsDead())then
|
|
myRole:Client_AccessTarget(player, reviveItem, nil, AccessCustomType.UseItem);
|
|
end
|
|
end , nil , nil, player.data.name)
|
|
end
|
|
|
|
function ScenePlayerRevive._DoExpel(playerid)
|
|
local player = NSceneUserProxy.Instance:Find(playerid);
|
|
if(not player)then
|
|
return;
|
|
end
|
|
|
|
if(player and player:IsDead())then
|
|
local skillId;
|
|
if(Game.MapManager:IsGvgMode_Droiyan())then
|
|
skillId = GameConfig.GvgDroiyan.ExpelSkill;
|
|
else
|
|
skillId = GameConfig.GVGConfig.expel_skill;
|
|
end
|
|
Game.Myself:Client_AccessTarget(player,
|
|
skillId,
|
|
nil,
|
|
AccessCustomType.UseSkill,
|
|
1);
|
|
end
|
|
end
|
|
|
|
function ScenePlayerRevive._CreateReviveEffect( effectHandle, args)
|
|
if(not effectHandle)then
|
|
return;
|
|
end
|
|
|
|
local self = args[1];
|
|
local playerid = args[2];
|
|
local reviveFunc = args[3];
|
|
local reviveItem = args[4];
|
|
|
|
ReusableTable.DestroyAndClearArray(args);
|
|
|
|
local obj = effectHandle.gameObject;
|
|
local spObj = UIUtil.GetAllComponentInChildren(obj, UIWidget)
|
|
NGUITools.AddWidgetCollider(spObj.gameObject, true);
|
|
|
|
self:AddClickEvent(spObj.gameObject, function (go)
|
|
reviveFunc(playerid, reviveItem);
|
|
end);
|
|
end
|
|
|
|
function ScenePlayerRevive:UpdatePlayerReviveState(playerid)
|
|
if(playerid == Game.Myself.data.id)then
|
|
return;
|
|
end
|
|
|
|
local reviveEffectId, reviveFunc, reviveItem;
|
|
if(Func_HaveReviveSkill())then
|
|
local reviveStone = self:GetReviveStoneItem();
|
|
if(reviveStone and reviveStone.num > 0)then
|
|
reviveEffectId = EffectMap.UI.Blue_Gemstone;
|
|
reviveFunc = ScenePlayerRevive._ReviveBySkill;
|
|
reviveItem = reviveStone;
|
|
end
|
|
end
|
|
if(reviveItem == nil)then
|
|
local reviveLeaf = self:GetReviveLeafItem();
|
|
if(reviveLeaf and reviveLeaf.num > 0)then
|
|
reviveEffectId = EffectMap.UI.Yggdrasilberry;
|
|
reviveFunc = ScenePlayerRevive._ReviveByLeaf;
|
|
reviveItem = reviveLeaf;
|
|
end
|
|
end
|
|
local player = NSceneUserProxy.Instance:Find(playerid)
|
|
if(not player)then
|
|
self:RemoveReviveEffect(playerid);
|
|
return false;
|
|
end
|
|
if(player:IsDead())then
|
|
self.deadPlayerMap[playerid] = 1;
|
|
else
|
|
self.deadPlayerMap[playerid] = nil;
|
|
end
|
|
|
|
local hasEvent = false;
|
|
|
|
if(self.deadPlayerMap[playerid])then
|
|
if(player.data:GetCamp() == RoleDefines_Camp.FRIEND)then
|
|
if(reviveItem and not player:IsInRevive())then
|
|
hasEvent = true;
|
|
|
|
self:RemoveReviveEffect(playerid);
|
|
local args = ReusableTable.CreateArray();
|
|
args[1] = self;
|
|
args[2] = playerid;
|
|
args[3] = reviveFunc;
|
|
args[4] = reviveItem;
|
|
|
|
local effect = SceneUIManager.Instance:PlayUIEffectOnRoleTop(
|
|
reviveEffectId,
|
|
playerid,
|
|
false,
|
|
false,
|
|
ScenePlayerRevive._CreateReviveEffect,
|
|
args);
|
|
effect:RegisterWeakObserver(self);
|
|
|
|
self.reviveEffectMap[playerid] = effect;
|
|
end
|
|
elseif(player.data:GetCamp() == RoleDefines_Camp.ENEMY)then
|
|
if(_MapManager:IsPVPMode() and
|
|
(_MapManager:IsPVPMode_GVGDetailed() or _MapManager:IsGvgMode_Droiyan()))then
|
|
hasEvent = true;
|
|
|
|
self:RemoveReviveEffect(playerid);
|
|
local args = ReusableTable.CreateArray();
|
|
args[1] = self;
|
|
args[2] = playerid;
|
|
args[3] = ScenePlayerRevive._DoExpel;
|
|
|
|
local effect = SceneUIManager.Instance:PlayUIEffectOnRoleTop(
|
|
EffectMap.UI.Expel,
|
|
playerid,
|
|
false,
|
|
false,
|
|
ScenePlayerRevive._CreateReviveEffect,
|
|
args);
|
|
effect:RegisterWeakObserver(self);
|
|
|
|
self.reviveEffectMap[playerid] = effect;
|
|
end
|
|
end
|
|
end
|
|
|
|
if(hasEvent)then
|
|
return true;
|
|
end
|
|
|
|
self:RemoveReviveEffect(playerid);
|
|
|
|
return false;
|
|
end
|
|
|
|
function ScenePlayerRevive:RemoveReviveEffect(playerid)
|
|
if(self.reviveEffectMap[playerid])then
|
|
self.reviveEffectMap[playerid]:Destroy();
|
|
end
|
|
self.reviveEffectMap[playerid] = nil;
|
|
end
|
|
|
|
function ScenePlayerRevive:ObserverDestroyed(obj)
|
|
for playerid,effect in pairs(self.reviveEffectMap)do
|
|
if(effect == obj)then
|
|
self.reviveEffectMap[playerid] = nil;
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|