Pārlūkot izejas kodu

同步置换后皮肤切换问题

SCFC 1 gadu atpakaļ
vecāks
revīzija
5764700397

+ 1 - 0
script/module/hero/HeroLogic.lua

@@ -246,6 +246,7 @@ function sendHeroBagList(human)
 		end
 	end
 
+	SkinLogic.OnLoginCheckEquipSkin(human)
 	print(" human onLogin  maxZDL is : ",  human.maxZDL.zhandouli)
 end
 

+ 1 - 20
script/module/hero/HeroTenZhiHuan.lua

@@ -106,7 +106,6 @@ function zhihuan(human, material2ID, heroIndexList)
     local materialList = {}
     local material2Cnt = 0
     local material1Star = 0
-    local nCreateHeroSkinId = nil
     for i = 1, heroIndexList[0] do    
         local heroIndex = heroIndexList[i]
         local heroID = HeroLogic.getHeroIdByIndex(human, heroIndex)
@@ -124,10 +123,6 @@ function zhihuan(human, material2ID, heroIndexList)
                 return Broadcast.sendErr(human, Lang.TENSTAR_ERR_MATERIAL)
             end
 
-            if heroGrid.skinOn and nil == nCreateHeroSkinId then
-                nCreateHeroSkinId = heroGrid.skinOn
-            end
-
             local materialHeroConfig = HeroExcel.hero[material1Config.heroID] 
             if materialHeroConfig.camp ~= materialHeroConfig.camp then
                 return Broadcast.sendErr(human, Lang.TENSTAR_ERR_CAMP)
@@ -136,10 +131,6 @@ function zhihuan(human, material2ID, heroIndexList)
         end
     end
 
-    if nCreateHeroSkinId then
-        print("[zhihuan] nCreateHeroSkinId = "..nCreateHeroSkinId)
-    end
-
     local config = UpNeedExcel.zhihuan[material1Star]
     if not config then 
         return Broadcast.sendErr(human, Lang.TENSTAR_ERR_SIZE)
@@ -183,10 +174,6 @@ function zhihuan(human, material2ID, heroIndexList)
     BagLogic.sendItemGetList3(human, outItems, "tenStar_displace")
 
     newHeroGrid.id = attrConfig.heroID
-    if nCreateHeroSkinId then
-        newHeroGrid.skinOn = nCreateHeroSkinId
-    end
-
     local newIndex = HeroLogic.addHeroByGrid(human, newHeroGrid, "tenStar_displace")
 
     if equipTb ~= nil then
@@ -205,13 +192,7 @@ function zhihuan(human, material2ID, heroIndexList)
         end
     end
 
-    if nCreateHeroSkinId then
-        -- 先脱
-        SkinLogic.skinOp(human, newIndex, 0)
-
-        -- 再穿
-        SkinLogic.skinOp(human, newIndex, nCreateHeroSkinId)
-    end
+    SkinLogic.OnLoginCheckEquipSkin(human, true)
 
     -- 发送给前端用来显示获得的英雄
     local msgRet = Msg.gc.GC_HERO_TEN_ZHIHUAN

+ 90 - 4
script/module/skin/SkinLogic.lua

@@ -365,20 +365,25 @@ function skinQuery(human)
        
     end
     msgRet.data[0] = cnt
+    msgRet.isEnd = 1
+    local bSend = false
     local maxLen = #msgRet.list -- 每次最多只能传30个
     cnt = 0
     for id in pairs(SkinExcel) do
         cnt = cnt + 1
         skinNetGen(human,msgRet.list[cnt],id)
-        --[[if cnt >= maxLen then
+        if cnt >= maxLen then
             msgRet.list[0] = maxLen
             cnt = 0
-            msgRet.isEnd = 1
             Msg.send(msgRet,human.fd)
-        end]]
+            msgRet.isEnd = 2
+            bSend = true
+        end
     end
     msgRet.list[0] = cnt
-    msgRet.isEnd = 2
+    if bSend then
+        msgRet.isEnd = 3
+    end
     Msg.send(msgRet,human.fd)
 end
 
@@ -491,4 +496,85 @@ function onFightBegin(human)
             obj.isSysAttrChange = true
         end
     end
+end
+
+-- 登录检测英雄皮肤装备数据
+function OnLoginCheckEquipSkin(human, bSyncClient)
+    if not human then
+        return
+    end
+
+    local skinBag = human.db.skinBag
+    if not skinBag then
+        return
+    end
+
+    -- 检测的英雄
+    local tCheckHero = {}
+    for i = 1,#skinBag do 
+        local data = skinBag[i]
+        local nSkinID = data.id
+
+        local tConfig = SkinExcel[nSkinID]
+        if not tConfig then
+            print("[OnLoginCheckEquipSkin] 严重问题, 找不到对应皮肤的配置 nSkinID = "..nSkinID)
+            break
+        end
+
+        local nHeroID = tConfig.heroId
+        tCheckHero[nHeroID] = tCheckHero[nHeroID] or {}
+
+        -- 找所有皮肤中是否有装备着的
+        local bEquip, nNowSkinID = false, 0
+        for nHaveSkinID, v in pairs(tCheckHero[nHeroID]) do
+            if v == 1 then
+                bEquip = true
+                nNowSkinID = nHaveSkinID
+                break
+            end
+        end
+
+        if data.state == 1 then
+            if false == bEquip then
+                tCheckHero[nHeroID][nSkinID] = 1            -- 装备标识
+
+                -- 所有英雄进行装备皮肤
+                local heroIdxList = HeroLogic.getHeroListById(human, nHeroID)
+                for _,idx in ipairs(heroIdxList) do
+                    human.db.heroBag[idx].skinOn = nSkinID
+                    RoleHeadLogic.setHead(human,tConfig.head,RoleHeadLogic.HEAD_TYPE_1)
+                    if tConfig.body ~= 0 then
+                        RoleHeadLogic.setHead(human,tConfig.body,RoleHeadLogic.HEAD_TYPE_3)
+                    end
+                end
+                print("[OnLoginCheckEquipSkin] 对玩家英雄设置了皮肤 nSkinID = "..nSkinID.." nHeroID = "..nHeroID)
+            else
+                tCheckHero[nHeroID][nSkinID] = 0            -- 未装备标识
+                data.state = 0
+                print("[OnLoginCheckEquipSkin] 同一个英雄穿上了两个皮肤!! 进行修正 nHeroID = "
+                .. nHeroID.." nNowSkinID = "..nNowSkinID .. " nSkinID = "..nSkinID)
+            end
+        else
+            tCheckHero[nHeroID][nSkinID] = 0            -- 未装备标识
+            if false == bEquip then
+                local heroIdxList = HeroLogic.getHeroListById(human, nHeroID)
+                local heroCfg = HeroExcel[nHeroID]
+    
+                for _,idx in ipairs(heroIdxList) do
+                    -- 脱下皮肤 并且还原默认身体 icon和head
+                    human.db.heroBag[idx].skinOn = nil
+                    --local defaultHead = RoleHeadLogic.getDefaultHead(human)
+                    RoleHeadLogic.setHead(human,heroCfg.head,RoleHeadLogic.HEAD_TYPE_1)
+    
+                    RoleHeadLogic.setHead(human,heroCfg.body,RoleHeadLogic.HEAD_TYPE_3)
+                end
+                print("[OnLoginCheckEquipSkin] 对玩家英雄设置取消了皮肤 nHeroID = "..nHeroID.." nSkinID = "..nSkinID)
+            end
+        end
+    end
+
+    if bSyncClient then
+        skinQuery(human)
+        print("[OnLoginCheckEquipSkin] 同步数据结束")
+    end
 end