2025-06-04 05:02:57 +08:00

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