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

533 lines
16 KiB
Plaintext

EnchantView = class("EnchantView",BaseView)
EnchantView.ViewType = UIViewType.NormalLayer
autoImport("EquipChooseBord");
autoImport("EnchantAttrInfoCell");
autoImport("EnchantEffectCell");
EnchantEffectType = {
Combine = "EnchantEffectType_combine",
Enchant = "EnchantEffectType_Enchant",
}
EnchantView.ButtonLabText = {
[EnchantType.Primary] = ZhString.EnchantView_PrimaryEnchant,
[EnchantType.Medium] = ZhString.EnchantView_MediumEnchant,
[EnchantType.Senior] = ZhString.EnchantView_SeniorEnchant,
}
EnchantView.EnchantAction = "use_magic";
local DEFAULT_MATERIAL_SEARCH_BAGTYPES;
local Enchant_MATERIAL_SEARCH_BAGTYPES;
function EnchantView:Init()
local pacakgeCheck = GameConfig.PackageMaterialCheck;
DEFAULT_MATERIAL_SEARCH_BAGTYPES = pacakgeCheck and pacakgeCheck.default or {1,9};
Enchant_MATERIAL_SEARCH_BAGTYPES = pacakgeCheck and pacakgeCheck.enchant or DEFAULT_MATERIAL_SEARCH_BAGTYPES;
local viewdata = self.viewdata and self.viewdata.viewdata;
self.npcdata = viewdata and viewdata.npcdata;
self.enchantType = viewdata and viewdata.enchantType or 1;
self:InitUI();
self:MapEvent();
end
function EnchantView:InitUI()
self.enchantTipBord = self:FindGO("EnchantTipBrod");
self.enchantEffectBord = self:FindGO("EnchantEffectBord");
self.enchantInfoBord = self:FindGO("EnchantInfoBord");
self.addItemButton = self:FindGO("AddItemButton");
self:AddClickEvent(self.addItemButton, function (go)
self:clickTargetItem();
end);
self.targetGo = self:FindGO("TargetCell");
self.targetItemCell = BaseItemCell.new(self.targetGo);
self.targetItemCell:AddEventListener(MouseEvent.MouseClick, self.clickTargetItem, self);
self.effectBg = self:FindComponent("EffectBg", ChangeRqByTex);
local enchantEffectGrid = self:FindComponent("EnchantEffectGrid", UIGrid, self.enchantEffectBord);
self.enchantEffectCtl = UIGridListCtrl.new(enchantEffectGrid, EnchantEffectCell, "EnchantEffectCell");
self.noEquipEnchantTip = self:FindGO("NoEnchantTip", self.enchantEffectBord);
local coins = self:FindGO("TopCoins");
self.usermrb = self:FindGO("MRB", coins);
self.mrbLabel = self:FindComponent("Label", UILabel, self.usergold);
self.mrbSymbol = self:FindComponent("symbol", UISprite, self.usermrb);
self.userRob = self:FindGO("Silver", coins);
self.robLabel = self:FindComponent("Label", UILabel, self.userRob);
local chooseContaienr = self:FindGO("ChooseContainer");
local chooseBordDataFunc = function ()
return self:GetEnchantEquips();
end
self.chooseBord = EquipChooseBord.new(chooseContaienr, chooseBordDataFunc);
self.chooseBord:AddEventListener(EquipChooseBord.ChooseItem, self.ChooseItem, self)
self.chooseBord:Hide();
self.enchantButton = self:FindGO("EnchantButton");
local buttonLab = self:FindComponent("Label", UILabel, self.enchantButton);
buttonLab.text = EnchantView.ButtonLabText[self.enchantType];
self:AddClickEvent(self.enchantButton, function (go) self:TryEnchant() end);
self.enchantTipLab = self:FindComponent("TipLabel", UILabel, self.enchantTipBord);
self.costGrid = self:FindComponent("CostGrid", UIGrid);
self.enchantMrbLab = self:FindComponent("MRB", UILabel, self.enchantTipBord);
self.encahntMrbSymbol = self:FindComponent("Sprite", UISprite, self.enchantMrbLab.gameObject);
self.enchantSliverLab = self:FindComponent("Sliver", UILabel, self.enchantTipBord);
self.enchantTipChoose = self:FindGO("ChooseState", self.enchantTipBord);
self.enchantTipUnChoose = self:FindGO("UnChooseState", self.enchantTipBord);
local enchantInfoButton = self:FindGO("EnchantInfoButton");
self:AddClickEvent(enchantInfoButton, function (go)
self.enchantInfoBord:SetActive(true);
end);
self.enchantInfoTitle = self:FindComponent("Title", UILabel, self.enchantInfoBord);
local enchantInfoTable = self:FindComponent("EnchantInfoTable", UITable);
self.enchantInfoCtl = UIGridListCtrl.new(enchantInfoTable , EnchantAttrInfoCell, "EnchantAttrInfoCell");
local infoCloseButton = self:FindGO("InfoCloseButton", self.enchantInfoBord);
self:AddClickEvent(infoCloseButton, function (go)
self.enchantInfoBord:SetActive(false);
end);
self.compareButton = self:FindGO("CompareButton");
self.saveAttriButton = self:FindGO("SaveAttriButton");
self:AddPressEvent(self.compareButton, function(go, isPress)
if(isPress)then
self:UpdateEquipEffect(false, true);
else
self:UpdateEquipEffect(true);
end
end);
self:AddClickEvent(self.saveAttriButton, function (go)
if(self.nowItemData and self.hasUnSaveAttri)then
ServiceItemProxy.Instance:CallProcessEnchantItemCmd(true, self.nowItemData.id);
end
end);
self:UpdateCoins();
self:UpdateEnchantTip();
end
function EnchantView:GetEnchantEquips()
local equipEquips = BagProxy.Instance.roleEquip:GetItems() or {};
local bagEquips = BagProxy.Instance:GetBagEquipItems()
local result = {};
for i=1,#equipEquips do
local staticData = equipEquips[i] and equipEquips[i].staticData;
local equipInfo = equipEquips[i] and equipEquips[i].equipInfo;
if(equipInfo and equipInfo:CanEnchant() and staticData.Type ~= 550 and staticData.Type ~= 560)then
table.insert(result, equipEquips[i]);
end
end
for i=1,#bagEquips do
local equipInfo = bagEquips[i] and bagEquips[i].equipInfo;
if(equipInfo and equipInfo:CanEnchant())then
table.insert(result, bagEquips[i]);
end
end
return result;
end
function EnchantView:clickTargetItem(cellCtl)
self.chooseBord:Show(true);
self.enchantInfoBord:SetActive(false);
self.chooseBord:SetChoose(self.nowItemData);
end
function EnchantView:ChooseItem(itemData)
self.nowItemData = itemData;
if(self.nowItemData)then
self.addItemButton:SetActive(false);
self.targetGo:SetActive(true);
else
self.addItemButton:SetActive(true);
self.targetGo:SetActive(false);
end
self.targetItemCell:SetData(self.nowItemData);
self.targetItemCell:UpdateMyselfInfo(self.nowItemData);
self:UpdateEquipEffect();
self:UpdateEnchantTip();
self.chooseBord:Hide();
end
function EnchantView:GetCost()
local itemType;
if(self.nowItemData)then
itemType = self.nowItemData.staticData.Type;
end
return BlackSmithProxy.Instance:GetEnchantCost(self.enchantType, itemType)
end
function EnchantView:GetMrb()
local itemCost,zenyCost = self:GetCost();
itemCost = itemCost and itemCost[1];
local itemid = itemCost and itemCost.itemid or 135;
local items = BagProxy.Instance:GetMaterialItems_ByItemId(itemid, Enchant_MATERIAL_SEARCH_BAGTYPES);
local searchNum = 0;
for i=1,#items do
searchNum = searchNum + items[i].num;
end
return searchNum;
end
function EnchantView:GetEnchantItemNum(itemid)
local items = BagProxy.Instance:GetMaterialItems_ByItemId(itemid, Enchant_MATERIAL_SEARCH_BAGTYPES);
local searchNum = 0;
for i=1,#items do
searchNum = searchNum + items[i].num;
end
return searchNum;
end
function EnchantView:UpdateCoins()
self.robLabel.text = StringUtil.NumThousandFormat(MyselfProxy.Instance:GetROB())
self.mrbLabel.text = StringUtil.NumThousandFormat(self:GetMrb())
end
function EnchantView:UpdateEquipEffect(withGoodTip, showOriginal)
local nowData = self.nowItemData;
if(nowData)then
self.enchantEffectBord:SetActive(true);
local resultEffect = {};
self.hasUnSaveAttri, enchantAttrs = nowData.enchantInfo:HasUnSaveAttri();
if(not showOriginal and self.hasUnSaveAttri)then
enchantAttrs = nowData.enchantInfo:GetCacheEnchantAttrs();
else
enchantAttrs = nowData.enchantInfo:GetEnchantAttrs();
end
self.hasNewGoodAttri = nowData.enchantInfo:HasNewGoodAttri();
for i=1,#enchantAttrs do
local temp = {};
temp.type = EnchantEffectType.Enchant;
temp.showline = true;
temp.withGoodTip = true;
temp.enchantAttri = enchantAttrs[i];
table.insert(resultEffect, temp)
end
local combineEffects;
if(not showOriginal and self.hasUnSaveAttri)then
combineEffects = nowData.enchantInfo:GetCacheCombineEffects();
else
combineEffects = nowData.enchantInfo:GetCombineEffects();
end
if(combineEffects)then
for i=1,#combineEffects do
local combineEffect = combineEffects[i];
if(combineEffect)then
local temp = {};
temp.type = EnchantEffectType.Combine;
temp.isWork = combineEffect.isWork;
if(temp.isWork)then
temp.combineTip = string.format("%s:%s", combineEffect.buffData.BuffName ,combineEffect.buffData.BuffDesc);
else
temp.combineTip = string.format("%s:%s(%s)", tostring(combineEffect.buffData.BuffName),
tostring(combineEffect.buffData.BuffDesc), tostring(combineEffect.WorkTip));
end
table.insert(resultEffect, temp);
end
end
end
self.enchantEffectCtl:ResetDatas(resultEffect);
self.noEquipEnchantTip:SetActive(#resultEffect==0);
self.saveAttriButton:SetActive(self.hasUnSaveAttri);
self.compareButton:SetActive(self.hasUnSaveAttri);
else
self.enchantEffectBord:SetActive(false);
self.hasUnSaveAttri = false;
self.hasNewGoodAttri = false;
end
end
function EnchantView:UpdateEnchantTip()
self.material_enough = false;
if(self.nowItemData)then
self.enchantTipChoose:SetActive(true);
self.enchantTipUnChoose:SetActive(false);
self.material_enough = true;
local itemCost,zenyCost = self:GetCost();
itemCost = itemCost and itemCost[1];
-- temp
if(itemCost and itemCost.num and itemCost.num > 0)then
local havNum = self:GetEnchantItemNum( itemCost.itemid );
self.enchantMrbLab.gameObject:SetActive(true);
if(havNum < itemCost.num)then
self.material_enough = false
self.enchantMrbLab.text = string.format("[c][FF3B0D]%s[-][/c]", "x"..tostring(itemCost.num));
else
self.enchantMrbLab.text = "x"..tostring(itemCost.num);
end
IconManager:SetItemIcon(Table_Item[itemCost.itemid].Icon, self.mrbSymbol)
IconManager:SetItemIcon(Table_Item[itemCost.itemid].Icon, self.encahntMrbSymbol)
else
IconManager:SetItemIcon(Table_Item[135].Icon, self.mrbSymbol)
self.enchantMrbLab.gameObject:SetActive(false);
end
if(zenyCost and zenyCost>0)then
self.enchantSliverLab.gameObject:SetActive(true);
if(MyselfProxy.Instance:GetROB() < zenyCost)then
self.material_enough = false
self.enchantSliverLab.text = string.format("[c][FF3B0D]%s[-][/c]", "x"..tostring(zenyCost));
else
self.enchantSliverLab.text = "x"..tostring(zenyCost);
end
else
self.enchantSliverLab.gameObject:SetActive(false);
end
self.costGrid.gameObject:SetActive(true);
self.costGrid:Reposition();
self.enchantTipLab.text = string.format(ZhString.EnchantView_EnchantTip,
self.nowItemData.staticData.NameZh, EnchantView.ButtonLabText[self.enchantType]);
self:UpdateEnchantInfo();
self:UpdateCoins();
else
self.costGrid.gameObject:SetActive(false);
self.enchantTipChoose:SetActive(false);
self.enchantTipUnChoose:SetActive(true);
end
end
function EnchantView:UpdateEnchantInfo()
if(self.nowItemData)then
local enchantDatas = self:CombineEnchantInfoDatas();
self.enchantInfoTitle.text = EnchantView.ButtonLabText[self.enchantType]..ZhString.EnchantView_Attri;
self.enchantInfoCtl:ResetDatas(enchantDatas);
else
errorLog("Not Select Item");
end
end
function EnchantView:CombineEnchantInfoDatas()
local enchantType = self.enchantType;
local enchantDatas = EnchantEquipUtil.Instance:GetEnchantDatasByEnchantType(enchantType);
local result = {};
local equipType = self.nowItemData.staticData.Type;
for attriType, data in pairs(enchantDatas)do
local attriMenuType, pos = EnchantEquipUtil.Instance:GetMenuType(attriType);
local infoData = result[attriMenuType]
if(not infoData)then
infoData = {};
infoData.attriMenuType = attriMenuType;
infoData.attris = {};
result[attriMenuType] = infoData;
end
local cbdata = {};
cbdata.attriMenuType = attriMenuType;
cbdata.equipType = equipType;
cbdata.enchantType = enchantType;
cbdata.enchantData, cbdata.canGet = data:Get(equipType);
cbdata.pos = pos;
table.insert(infoData.attris, cbdata);
end
local combineEffects = EnchantEquipUtil.Instance:GetCombineEffects(enchantType);
local hasValue = next(combineEffects);
if(hasValue)then
local infoData = {};
infoData.attriMenuType = EnchantMenuType.CombineAttri;
infoData.attris = {};
table.insert(result, infoData);
local enchantEquipUtil = EnchantEquipUtil.Instance;
local nameKeysMap,attris = {}, infoData.attris;
for _,data in pairs(combineEffects)do
if(nameKeysMap[ data.Name ] == nil)then
local cbdata = {};
cbdata.attriMenuType = EnchantMenuType.CombineAttri;
cbdata.equipType = equipType;
cbdata.enchantType = enchantType;
cbdata.enchantData = data;
cbdata.pos = data.id;
cbdata.canGet = enchantEquipUtil:CanGetCombineEffect(data, equipType)
table.insert(attris, cbdata);
nameKeysMap[ data.Name ] = #attris;
else
local canGet = enchantEquipUtil:CanGetCombineEffect(data, equipType)
if(canGet)then
local cbdata = attris[ nameKeysMap[data.Name] ];
cbdata.enchantData = data;
cbdata.pos = data.id;
cbdata.canGet = true;
end
end
end
end
return result;
end
function EnchantView:TryEnchant()
if(self.waitRecv)then
return;
end
if(self.nowItemData)then
local hasNewGoodAttri = self.nowItemData.enchantInfo:HasNewGoodAttri();
if(hasNewGoodAttri)then
MsgManager.ConfirmMsgByID(3060,function ()
-- ServiceItemProxy.Instance:CallProcessEnchantItemCmd(false, self.nowItemData.id);
self:DoEnchant();
end , nil , nil)
return;
end
self:DoEnchant();
else
printRed("No Choosem Item");
end
end
function EnchantView:DoEnchant()
FunctionSecurity.Me():EnchantingEquip(self.ExcuteEnchant, self);
end
function EnchantView:ExcuteEnchant()
if(self.nowItemData)then
if(not self:HasErrorEnchantInfo(self.nowItemData))then
if(not self.material_enough)then
MsgManager.ShowMsgByIDTable(8);
return;
end
end
if(not self.material_enough)then
MsgManager.ShowMsgByIDTable(8);
return;
end
if(self.npcdata)then
self.npcdata:Client_PlayAction(EnchantView.EnchantAction, nil, false);
end
self.waitRecv = true;
ServiceItemProxy.Instance:CallEnchantEquip(self.enchantType, self.nowItemData.id)
end
end
function EnchantView:HasErrorEnchantInfo(itemData)
local enchantInfo = itemData.enchantInfo;
if(enchantInfo)then
local attris = enchantInfo:GetEnchantAttrs();
local combineEffect = enchantInfo:GetCombineEffects();
if(#combineEffect == 0)then
local temp = {
["MaxSpPer"] = 0,
["MAtk"] = 0,
["EquipASPD"] = 0,
["DamIncrease"] = 0,
};
for i=1,#attris do
if(temp[ attris[i].type ] == 0)then
temp[ attris[i].type ] = 1;
end
end
if(temp["MaxSpPer"] == 1 and temp["MAtk"] == 1)then
return true;
elseif(temp["DamIncrease"] or temp["EquipASPD"] == 1)then
return true;
end
end
end
return false;
end
function EnchantView:MapEvent()
self:AddListenEvt(ServiceEvent.ItemEnchantEquip, self.HandleEnchantEnd);
self:AddListenEvt(ItemEvent.ItemUpdate, self.HandleEnchantItemUpdate);
self:AddListenEvt(ItemEvent.EquipUpdate, self.HandleEnchantItemUpdate);
self:AddListenEvt(MyselfEvent.MyDataChange, self.HandleMyDataChange)
end
function EnchantView:HandleMyDataChange(note)
self:UpdateCoins();
self:UpdateEnchantTip();
end
function EnchantView:HandleEnchantEnd(note)
self.waitRecv = false;
self:UpdateEquipEffect(true);
self:UpdateEnchantTip();
self:PlayCommonSound(AudioMap.Maps.Refinesuccess);
self:PlayUIEffect(EffectMap.UI.upgrade_surprised,
self.effectBg.gameObject,
true,
EnchantView.UpgradeEffectHandle,
self);
end
function EnchantView.UpgradeEffectHandle(effectHandle, owner)
if(owner)then
owner.effectBg:AddChild(effectHandle.gameObject);
end
end
function EnchantView:HandleEnchantItemUpdate()
self:UpdateEquipEffect(true);
self:UpdateEnchantTip();
end
function EnchantView:OnEnter()
EnchantView.super.OnEnter(self);
if(self.npcdata)then
local npcTrans = self.npcdata.assetRole.completeTransform;
if(npcTrans)then
local viewPort = CameraConfig.HappyShop_ViewPort
local rotation = CameraConfig.HappyShop_Rotation
self:CameraFaceTo(npcTrans,viewPort,rotation)
end
end
self.waitRecv = false;
end
function EnchantView:OnExit()
self:CameraReset();
EnchantView.super.OnExit(self);
end
function EnchantView:CloseSelf()
if( self.nowItemData)then
if(self.hasNewGoodAttri)then
MsgManager.ConfirmMsgByID(3060,function ()
ServiceItemProxy.Instance:CallProcessEnchantItemCmd(false, self.nowItemData.id);
EnchantView.super.CloseSelf(self);
end , nil, nil)
return;
elseif(self.hasUnSaveAttri)then
ServiceItemProxy.Instance:CallProcessEnchantItemCmd(false, self.nowItemData.id);
end
end
EnchantView.super.CloseSelf(self);
end