From 3f5967eeefb1329d272e13e5823a7961ec0ea92c Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期四, 11 四月 2019 21:24:45 +0800
Subject: [PATCH] 6457 【后端】【2.0】缥缈仙域开发单(定制)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py |  243 ++++++++++++++++++++++++++++++------------------
 1 files changed, 153 insertions(+), 90 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 8b756d8..16b5138 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 玩家实例
@@ -192,17 +194,13 @@
     return
 
 ## 登录
-def ShopItemOnLogin(curPlayer):
-    if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_VersionFix, ChConfig.Def_VerFix_SuperGift):
-        GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_VersionFix, ChConfig.Def_VerFix_SuperGift, 1)
-        isGet = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GoldGiftFirstRecord)
-        if isGet:#首充奖励已领取则代表超值礼包已开启过,
-            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SuperGiftHasOpen, 1)
-            
-    
-    SyncMysticalShopInfo(curPlayer)
+def ShopItemOnLogin(curPlayer):    
+    SyncMysticalLimitShopInfo(curPlayer)
     SyncShopItemTodayBuyCount(curPlayer)
     SyncSuperGiftInfo(curPlayer)
+    if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MysticalShopGoods % 0):
+        __DoMysticalShopRefresh(curPlayer, True, GameWorld.GetGameWorld().GetTick())
+    SyncMysticalShopInfo(curPlayer)
     return
 
 ##商店物品OnDay
@@ -213,6 +211,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)
@@ -260,16 +262,20 @@
     ResetShopItemBuyCount(curPlayer, [refreshType])
     return
 
-def ResetShopItemBuyCount(curPlayer, onEventTypeList=[]):
-    #@param onEventTypeList: 需要重置的类型列表,为空时重置所有类型
+def ResetShopItemBuyCount(curPlayer, resetTypeList):
+    #@param resetTypeList: 需要重置的类型列表
     #重置商店物品购买次数  1:周一0点刷新    2:周一5点刷新    3:每日0点刷新    4:每日5点刷新    5每月0点    6每月5点   7每3天5点  8每赛季
+    if not resetTypeList:
+        # 暂定必须指定类型列表,防止终身限购的误被重置
+        return
+    
     syncIndexList = []
     ipyDataMgr = IpyGameDataPY.IPY_Data()
     for i in xrange(ipyDataMgr.GetStoreCount()):
         shopItem = ipyDataMgr.GetStoreByIndex(i)
         if not shopItem.GetLimitCnt():
             continue
-        if onEventTypeList and shopItem.GetRefreshType() not in onEventTypeList:
+        if shopItem.GetRefreshType() not in resetTypeList:
             continue
         dayBuyCntKey = ChConfig.Def_PDict_ShopItemDayBuyCnt % shopItem.GetID()
         curDayBuyCnt = curPlayer.NomalDictGetProperty(dayBuyCntKey)
@@ -301,7 +307,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:
@@ -316,10 +322,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 = []
@@ -341,6 +347,134 @@
     if not packData.ShopTimeList:
         return
     packData.Count = len(packData.ShopTimeList)
+    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))
+    syncIndexList = []
+    for i in xrange(maxCnt):
+        goodsID = goodsResultList[i] if i < len(goodsResultList) else 0
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MysticalShopGoods % i, goodsID)
+        
+        dayBuyCntKey = ChConfig.Def_PDict_ShopItemDayBuyCnt % goodsID
+        curDayBuyCnt = curPlayer.NomalDictGetProperty(dayBuyCntKey)
+        if curDayBuyCnt:
+            PlayerControl.NomalDictSetProperty(curPlayer, dayBuyCntKey, 0)
+            syncIndexList.append(goodsID)
+    if syncIndexList:
+        SyncShopItemTodayBuyCount(curPlayer, syncIndexList, True)
+    #通知
+    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
 
@@ -591,7 +725,7 @@
 
     itemControl = ItemControler.PlayerItemControler(curPlayer)
     for itemID, itemCount, isBind in totalItemList:
-        curItemObj = ItemControler.GetOutPutItemObj(itemID, itemCount, isBind)
+        curItemObj = ItemControler.GetOutPutItemObj(itemID, itemCount, False)
         if not curItemObj:
             continue
         userData = curItemObj.GetUserData()
@@ -720,10 +854,7 @@
             #活动结束 重置
             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SuperGiftStartTime, 0)
     else:
-        if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SuperGiftHasOpen):
-            #老号已开启过超值礼包则不再开启
-            return
-        
+              
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SuperGiftStartTime, curTime)
         addItemList = IpyGameDataPY.GetFuncEvalCfg('SuperGiftTimeList', 2)
         PlayerControl.SendMailByKey('SellMail2', [curPlayer.GetID()], addItemList)
@@ -795,46 +926,6 @@
 
     return True
 
-
-#---------------------------------------------------------------------
-##检查物品可否修理
-# @param curPlayer 玩家实例
-# @param curItem 物品实例
-# @param farRepair 是否远程修理
-# @return 返回值真, 检查通过
-# @remarks 检查物品可否修理
-#===============================================================================
-# def __CheckRepairItem(curPlayer, curItem, farRepair):
-#    
-#    if not ItemCommon.CheckItemCanUse(curItem):
-#        if not farRepair:
-#            #封包信息不正确
-#            PlayerControl.NotifyCode(curPlayer, "UseResLost04")
-#            
-#        return
-#    
-#    if curItem.GetCanRepair() == 0:
-#        if not farRepair:
-#            #物品不可修理
-#            PlayerControl.NotifyCode(curPlayer, "UseResLost13")   
-#            
-#        return
-#    
-#    if ItemControler.IsEventItem(curItem):
-#        if not farRepair:
-#            PlayerControl.NotifyCode(curPlayer, "itemuse_chenxin_31379")
-#             
-#        return
-#    
-#    if curItem.GetEndureReduceType() == ChConfig.Def_EquipReduceType_None or curItem.GetMaxEndure() == 0:
-#        if not farRepair:
-#            #耐久字段为0,不符合要求,返回
-#            PlayerControl.NotifyCode(curPlayer, "UseResLost13")
-#            
-#        return
-#    
-#    return True
-#===============================================================================
 #--------------------出售物品
 ##出售物品
 # @param curPlayer 玩家实例
@@ -956,7 +1047,7 @@
 # @return 返回值真, 检查通过
 # @remarks 检查物品是否可以出售
 def __CheckItemSell(curPlayer, curItem) :
-    if not ItemCommon.CheckItemCanUse(curItem):
+    if not ItemCommon.CheckItemCanUse(curItem) or ItemControler.GetIsAuctionItem(curItem):
         PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_644055")
         return
     
@@ -1001,35 +1092,7 @@
     priceType = IPY_GameWorld.TYPE_Price_Silver_Money
     curItemPrice = curItem.GetSilverPrice()
     return curItemPrice, priceType
-    #绑定价格售价为0, 2011.4.27
-#    if curItem.GetIsBind():
-#        itrmPrice_bind = eval(ReadChConfig.GetChConfig("ItemSellPrice_Bind"))
-#        return itrmPrice_bind, priceType
-#    
-#    #无耐久物品
-#    if curItemEndure == 0 :
-#        return curItemPrice * 0.5, priceType
-#    
-#    itrmPrice_notBind = eval(ReadChConfig.GetChConfig("ItemSellPrice_NotBind"))
-#    return itrmPrice_notBind, priceType
-#===============================================================================
-#   2010.11.25 绑定售价和非绑定一致
-#        #绑定的
-#        if curItem.GetIsBind():
-#            return curItemPrice * 0.5 * 0.5, curItemType
-#        #非绑定的
-#        return curItemPrice * 0.5, curItemType
-#===============================================================================
-#===============================================================================
-#    
-#    #绑定正常物品出售价格
-#    if curItem.GetIsBind() :
-#        return eval(ChConfig.Def_Formula_ItemSellPrice) * 0.5, curItemType
-#    
-#    #未绑定正常物品出售价格
-#    return eval(ChConfig.Def_Formula_ItemSellPrice), curItemType
-#===============================================================================
-#---------------------------------------------------------------------
+
 ##检查玩家可否开始NPC事件
 # @param curPlayer 玩家实例
 # @return 返回值真, 检查通过

--
Gitblit v1.8.0