From c04a87b2679e8561dcbe3fad845e169a27f1ec46 Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期五, 22 二月 2019 17:11:37 +0800
Subject: [PATCH] 6256 子 【开发】【2.0】神秘商店开发 / 【后端】【2.0】神秘商店

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py |  134 +++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 130 insertions(+), 4 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py
index 2573564..8fb8a5e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py
@@ -71,6 +71,8 @@
 import random
 import math
 import time
+
+g_mysticalShopDict = {} #神秘商店{等级范围:[等级段,{金钱类型:库}]}
 #---------------------------------------------------------------------
 ##开始交易
 # @param curPlayer 玩家实例
@@ -200,9 +202,10 @@
             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SuperGiftHasOpen, 1)
             
     
-    SyncMysticalShopInfo(curPlayer)
+    SyncMysticalLimitShopInfo(curPlayer)
     SyncShopItemTodayBuyCount(curPlayer)
     SyncSuperGiftInfo(curPlayer)
+    SyncMysticalShopInfo(curPlayer)
     return
 
 ##商店物品OnDay
@@ -213,6 +216,10 @@
         UpdataSuperGiftTime(curPlayer, True)
         OSSaleOpenMail(curPlayer)
         refreshType = [3]
+        #神秘商店刷新次数重置
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MysticalShopRefreshCnt, 0)
+        SyncMysticalShopInfo(curPlayer)
+        
     elif onEventType == ShareDefine.Def_OnEventTypeEx:
         refreshType = [4]
         openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)
@@ -305,7 +312,7 @@
         SyncShopItemTodayBuyCount(curPlayer, syncIndexList, True)
     return
 
-def MysticalShopOpen(curPlayer, befLV, aftLV):
+def MysticalLimitShopOpen(curPlayer, befLV, aftLV):
     ##神秘限购开启
     ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('Store', {'ShopType':16}, True)
     if not ipyDataList:
@@ -320,10 +327,10 @@
             syncGoodsList.append(goodsID)
             GameWorld.DebugLog('神秘限购商品%s 开卖'%goodsID, curPlayer.GetID())
     if syncGoodsList:
-        SyncMysticalShopInfo(curPlayer)
+        SyncMysticalLimitShopInfo(curPlayer)
     return
 
-def SyncMysticalShopInfo(curPlayer):
+def SyncMysticalLimitShopInfo(curPlayer):
     ##神秘限购通知
     packData = ChPyNetSendPack.tagMCMysticalShopTimeInfo()
     packData.ShopTimeList = []
@@ -348,6 +355,125 @@
     NetPackCommon.SendFakePack(curPlayer, packData)
     return
 
+def CheckMysticalShopRefresh(curPlayer, tick):
+    ##神秘商店刷新
+    createRoleTime = curPlayer.GetCreateRoleTime()
+    diffTime = GameWorld.GetCurrentTime() - GameWorld.GetDateTimeByStr(createRoleTime, ChConfig.TYPE_Time_Format)
+    pastSeconds = diffTime.days*24*60*60 + diffTime.seconds
+    refreshTime = IpyGameDataPY.GetFuncCfg('MysteryShopRefresh', 4)
+    if pastSeconds % refreshTime == 0:
+        __DoMysticalShopRefresh(curPlayer, True, tick)
+    return
+
+#// A2 32 神秘商店刷新 #tagCMRefreshMysticalShop
+#struct    tagCMRefreshMysticalShop
+#{
+#    tagHead        Head;
+#};
+def OnMysticalShopRefresh(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    __DoMysticalShopRefresh(curPlayer, False, tick)
+    return
+
+def __DoMysticalShopRefresh(curPlayer, isFree, tick):
+    global g_mysticalShopDict #{等级范围:[等级段,{金钱类型:库}]}
+    
+    lastTime = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MysticalShopLastTime)
+    if lastTime and tick - lastTime < 1000:
+        #GameWorld.DebugLog('神秘商店刷新,过于频繁!')
+        return
+    curPlayer.SetDict(ChConfig.Def_PlayerKey_MysticalShopLastTime, tick)
+    if not g_mysticalShopDict:
+        ipyMgr= IpyGameDataPY.IPY_Data()
+        for i in xrange(ipyMgr.GetMysteryShopCount()):
+            ipyData = ipyMgr.GetMysteryShopByIndex(i)
+            lvRange = ipyData.GetLVRange()
+            goodsID = ipyData.GetGoodsID()
+            goodsIpyData = IpyGameDataPY.GetIpyGameData('Store', goodsID)
+            moneyType = goodsIpyData.GetMoneyType()
+            weight = goodsIpyData.GetLimitValue()
+            lvkey = tuple(lvRange)
+            if lvkey not in g_mysticalShopDict:
+                g_mysticalShopDict[lvkey] = [lvkey[0], {}]
+                weightDict = {}
+            if moneyType not in g_mysticalShopDict[lvkey][1]:
+                g_mysticalShopDict[lvkey][1][moneyType] = []
+            weightDict[moneyType] = weightDict.get(moneyType, 0) + weight
+            g_mysticalShopDict[lvkey][1][moneyType].append([weightDict[moneyType], goodsID])
+            
+    playerLV = curPlayer.GetLV()
+    curLVDan, shopDict = GameWorld.GetDictValueByRangeKey(g_mysticalShopDict, playerLV)
+    if not shopDict:
+        return
+    maxCnt = IpyGameDataPY.GetFuncCfg('MysteryShopGoods', 1)
+    goldGoodsCnt =GameWorld.GetResultByRandomList(IpyGameDataPY.GetFuncEvalCfg('MysteryShopGoods', 2))
+    if not goldGoodsCnt:
+        return
+    specialGoodsID = 0 #必出的商品ID
+    if not isFree:
+        #优先道具,再仙玉
+        itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
+        costItemID = IpyGameDataPY.GetFuncCfg('MysteryShopRefresh', 1)
+        costItemCntDict = IpyGameDataPY.GetFuncEvalCfg('MysteryShopRefresh', 2)
+        curRefreshCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MysticalShopRefreshCnt)
+        cntList = [int(cnt) for cnt in costItemCntDict.keys()]
+        cntList.sort()
+        costItemCnt = costItemCntDict[str(cntList[-1])]
+        for cnt in cntList:
+            if curRefreshCnt <= cnt:
+                costItemCnt = costItemCntDict[str(cnt)]
+                break
+        enough, indexList, hasBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(costItemID, itemPack, costItemCnt)
+        costGold = 0
+        if not enough:
+            costGold = lackCnt * IpyGameDataPY.GetFuncCfg('MysteryShopRefresh', 3)
+            if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costGold, ChConfig.Def_Cost_MysteryShopRefresh):
+                return
+        ItemCommon.ReduceItem(curPlayer, itemPack, indexList, costItemCnt, False, "MysteryShopRefresh")
+        curLVRefreshData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MysticalShopLVRefreshCnt)
+        curLVRefreshCnt, lvDan = curLVRefreshData / 10000, curLVRefreshData % 10000 
+        updLVRefreshCnt = 1 if curLVDan != lvDan else curLVRefreshCnt + 1 #等级段变更,重置该等级段的刷新次数
+        updLVRefreshData = min(updLVRefreshCnt * 10000+curLVDan, ChConfig.Def_UpperLimit_DWord)
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MysticalShopLVRefreshCnt, updLVRefreshData)
+        specialRefreshCfg = IpyGameDataPY.GetFuncEvalCfg('MysteryShopRefresh', 5)
+        if curLVDan in specialRefreshCfg and updLVRefreshCnt == specialRefreshCfg[curLVDan][0]:
+            specialGoodsID = specialRefreshCfg[curLVDan][1]
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MysticalShopRefreshCnt, curRefreshCnt+1)
+        
+    goldGoodsCnt = min(goldGoodsCnt, maxCnt)
+    sliverGoodsCnt = maxCnt - goldGoodsCnt
+    goodsResultList = []
+    if goldGoodsCnt:
+        goodsResultList += GameWorld.GetResultByRandomListEx(shopDict.get(IPY_GameWorld.TYPE_Price_Gold_Money, []), goldGoodsCnt, [])
+    if sliverGoodsCnt:
+        goodsResultList += GameWorld.GetResultByRandomListEx(shopDict.get(IPY_GameWorld.TYPE_Price_Silver_Money, []), sliverGoodsCnt, [])
+    if specialGoodsID and specialGoodsID not in goodsResultList:
+        goodsResultList[0] = specialGoodsID
+        GameWorld.DebugLog('神秘商店刷新特殊规则,等级段:%s,updLVRefreshCnt=%s,specialGoodsID=%s'%(curLVDan, updLVRefreshCnt, specialGoodsID))
+    
+    GameWorld.DebugLog('神秘商店刷新isFree=%s,goldGoodsCnt=%s,sliverGoodsCnt=%s,goodsResultList=%s'%(isFree, goldGoodsCnt, sliverGoodsCnt, goodsResultList))
+    for i in xrange(maxCnt):
+        goodsID = goodsResultList[i] if i < len(goodsResultList) else 0
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MysticalShopGoods % i, goodsID)
+    #通知
+    SyncMysticalShopInfo(curPlayer)
+    return
+
+def SyncMysticalShopInfo(curPlayer):
+    ##神秘商店通知
+    packData = ChPyNetSendPack.tagMCMysticalShopInfo()
+    packData.RefreshCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MysticalShopRefreshCnt)
+    packData.GoodsList = []
+    maxCnt = IpyGameDataPY.GetFuncCfg('MysteryShopGoods', 1)
+    for i in xrange(maxCnt):
+        goodsID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MysticalShopGoods % i)
+        goodsInfo = ChPyNetSendPack.tagMCMysticalShopGoods()
+        goodsInfo.GoodsID = goodsID
+        packData.GoodsList.append(goodsInfo)
+    packData.Count = len(packData.GoodsList)
+    NetPackCommon.SendFakePack(curPlayer, packData)
+    return
+
 ## 回购物品
 #  @param None
 #  @return None

--
Gitblit v1.8.0