| | |
| | | import math
|
| | | import time
|
| | |
|
| | | # 商店类型定义
|
| | | ShopType_FairyCeremony = 19 # 仙界盛典烟花
|
| | |
|
| | | g_mysticalShopDict = {} #神秘商店{等级范围:[等级段,{金钱类型:库}]}
|
| | | #---------------------------------------------------------------------
|
| | | ##开始交易
|
| | |
| | | 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)
|
| | | |
| | | |
| | | 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
|
| | | def ShopItemOnDay(curPlayer, onEventType):
|
| | | if onEventType == ShareDefine.Def_OnEventType:
|
| | | UpdataSuperGiftTime(curPlayer, True)
|
| | | OSSaleOpenMail(curPlayer)
|
| | | refreshType = [3]
|
| | | #神秘商店刷新次数重置
|
| | |
| | | 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:
|
| | | if refreshTime and pastSeconds % refreshTime == 0:
|
| | | __DoMysticalShopRefresh(curPlayer, True, tick)
|
| | | return
|
| | |
|
| | |
| | |
|
| | | def __DoMysticalShopRefresh(curPlayer, isFree, tick):
|
| | | global g_mysticalShopDict #{等级范围:[等级段,{金钱类型:库}]}
|
| | | |
| | | refreshTime = IpyGameDataPY.GetFuncCfg('MysteryShopRefresh', 4)
|
| | | if not refreshTime:
|
| | | return
|
| | |
|
| | | lastTime = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MysticalShopLastTime)
|
| | | if lastTime and tick - lastTime < 1000:
|
| | | #GameWorld.DebugLog('神秘商店刷新,过于频繁!')
|
| | |
| | | lvRange = ipyData.GetLVRange()
|
| | | goodsID = ipyData.GetGoodsID()
|
| | | goodsIpyData = IpyGameDataPY.GetIpyGameData('Store', goodsID)
|
| | | if not goodsIpyData:
|
| | | continue
|
| | | moneyType = goodsIpyData.GetMoneyType()
|
| | | weight = goodsIpyData.GetLimitValue()
|
| | | lvkey = tuple(lvRange)
|
| | |
| | | g_mysticalShopDict[lvkey][1][moneyType] = []
|
| | | weightDict[moneyType] = weightDict.get(moneyType, 0) + weight
|
| | | g_mysticalShopDict[lvkey][1][moneyType].append([weightDict[moneyType], goodsID])
|
| | | |
| | | if not g_mysticalShopDict:
|
| | | return |
| | | playerLV = curPlayer.GetLV()
|
| | | curLVDan, shopDict = GameWorld.GetDictValueByRangeKey(g_mysticalShopDict, playerLV)
|
| | | if not shopDict:
|
| | |
| | | sendMailKey = mailKey if isLackPack and mailKey else '' #背包不足且配置了mailKey的才发邮件
|
| | |
|
| | | # 购买限制条件扩展
|
| | | if CheckBuyItemLimitEx(curPlayer, shopType, itemIndex, mainItemID, ipyData.GetLimitValue()):
|
| | | if CheckBuyItemLimitEx(curPlayer, shopType, itemIndex, mainItemID, ipyData.GetLimitValue(), clientBuyCount):
|
| | | GameWorld.Log("Store shop item buy limit! shopType=%s,itemIndex=%s,limitValue=%s"
|
| | | % (shopType, itemIndex, ipyData.GetLimitValue()), curPlayer.GetPlayerID())
|
| | | return
|
| | |
| | |
|
| | | itemControl = ItemControler.PlayerItemControler(curPlayer)
|
| | | for itemID, itemCount, isBind in totalItemList:
|
| | | curItemObj = ItemControler.GetOutPutItemObj(itemID, itemCount, False)
|
| | | curItemObj = ItemControler.GetOutPutItemObj(itemID, itemCount, False, curPlayer=curPlayer)
|
| | | if not curItemObj:
|
| | | continue
|
| | | userData = curItemObj.GetUserData()
|
| | |
| | |
|
| | | if ipyData.GetNotifyMark() and itemID == mainItemID:
|
| | | PlayerControl.WorldNotify(0, ipyData.GetNotifyMark(), [curPlayer.GetName(), mainItemID, userData])
|
| | | |
| | | # 购买永久守护时删除限时守护
|
| | | if itemID == 4101:
|
| | | delGuardItem = ItemCommon.FindItemInPackByItemID(curPlayer, 4105, IPY_GameWorld.rptItem)
|
| | | if delGuardItem:
|
| | | ItemCommon.DelItem(curPlayer, delGuardItem, 1)
|
| | | |
| | | if sendMailKey:
|
| | | PlayerControl.SendMailByKey(sendMailKey, [curPlayer.GetID()], totalItemList, detail=dataDict)
|
| | | #触发任务购买物品
|
| | | EventShell.EventRespons_ShopBuy(curPlayer, shopType)
|
| | | #curPlayer.ShopResult(itemIndex, IPY_GameWorld.tsrShopOK)
|
| | | SyncShoppingResult(curPlayer, itemIndex, clientBuyCount)
|
| | | if itemIndex in IpyGameDataPY.GetFuncEvalCfg('CeremonyFireParty', 1, {}).values():
|
| | | PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_Fireworks, clientBuyCount)
|
| | | if itemIndex in IpyGameDataPY.GetFuncEvalCfg('NewCeremonyFireParty', 1, {}).values():
|
| | | PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_Fireworks, clientBuyCount)
|
| | |
|
| | | if shopType == ShopType_FairyCeremony:
|
| | | PlayerFairyCeremony.OnBuyFireworks(curPlayer, itemIndex, clientBuyCount)
|
| | | # if itemIndex in IpyGameDataPY.GetFuncEvalCfg('NewCeremonyFireParty', 1, {}).values():
|
| | | # PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_Fireworks, clientBuyCount)
|
| | | return
|
| | |
|
| | | def GetShopJobItem(job, itemID, jobItemList):
|
| | |
| | | ## 商店购买物品限制条件扩展
|
| | | # @param curPlayer 玩家实例
|
| | | # @return
|
| | | def CheckBuyItemLimitEx(curPlayer, shopNPCID, itemIndex, curItemID, limitValue):
|
| | | def CheckBuyItemLimitEx(curPlayer, shopNPCID, itemIndex, curItemID, limitValue, clientBuyCount):
|
| | | if shopNPCID == 7: #符印商店
|
| | | return not PlayerRune.GetIsOpenByRuneID(curPlayer, curItemID)
|
| | | if shopNPCID in [8, 9, 10]: #仙盟商店
|
| | |
| | | #playerCreateRoleDays = GameWorld.GetCreateRoleDays(curPlayer)
|
| | | openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)+1
|
| | | return openServerDay != limitValue
|
| | | #烟花狂欢
|
| | | if itemIndex in IpyGameDataPY.GetFuncEvalCfg('CeremonyFireParty', 1, {}).values():
|
| | | return not PlayerFairyCeremony.IsCanBuyFireworks(curPlayer, itemIndex)
|
| | | if itemIndex in IpyGameDataPY.GetFuncEvalCfg('NewCeremonyFireParty', 1, {}).values():
|
| | | return not PlayerNewFairyCeremony.IsCanBuyFireworks(curPlayer, itemIndex)
|
| | | # if itemIndex in dict(IpyGameDataPY.GetFuncEvalCfg('SuperGiftTimeList')):
|
| | | # return not CheckSuperGiftBuy(curPlayer, itemIndex)
|
| | | |
| | | #仙界盛典 - 烟花狂欢
|
| | | if shopNPCID == ShopType_FairyCeremony:
|
| | | return not PlayerFairyCeremony.IsCanBuyFireworks(curPlayer, itemIndex, clientBuyCount)
|
| | | |
| | | #另一个仙界盛典可用其他商店NPCID,这里先注释,之后再改
|
| | | # if itemIndex in IpyGameDataPY.GetFuncEvalCfg('NewCeremonyFireParty', 1, {}).values():
|
| | | # return not PlayerNewFairyCeremony.IsCanBuyFireworks(curPlayer, itemIndex)
|
| | | |
| | | if shopNPCID == 16:#神秘限购
|
| | | startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShopItemStartTime % itemIndex)
|
| | | curTime = int(time.time())
|
| | |
| | | PlayerControl.SendMailByKey('SellMail1', [curPlayer.GetID()], addItemList)
|
| | | return
|
| | |
|
| | | #超值礼包购买时间
|
| | | def UpdataSuperGiftTime(curPlayer, isOnday=False):
|
| | | curTime = int(time.time())
|
| | | if isOnday:
|
| | | startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SuperGiftStartTime)
|
| | | if not startTime:
|
| | | return
|
| | | superGiftTimeList = IpyGameDataPY.GetFuncEvalCfg('SuperGiftTimeList')
|
| | | maxDay = max([info[1] for info in superGiftTimeList])
|
| | | if curTime - startTime >= maxDay * 86400:
|
| | | #活动结束 重置
|
| | | 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)
|
| | | SyncSuperGiftInfo(curPlayer)
|
| | | return True
|
| | |
|
| | | def SyncSuperGiftInfo(curPlayer):
|
| | | startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SuperGiftStartTime)
|
| | | if not startTime:
|
| | | return
|
| | | packData = ChPyNetSendPack.tagMCSuperGiftInfo()
|
| | | packData.StartTime = startTime
|
| | | NetPackCommon.SendFakePack(curPlayer, packData)
|
| | | return
|
| | | def CheckSuperGiftBuy(curPlayer, giftID):
|
| | | #超值礼包是否可购买
|
| | | startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SuperGiftStartTime)
|
| | | if not startTime:
|
| | | return
|
| | | |
| | | superGiftTimeDict = dict(IpyGameDataPY.GetFuncEvalCfg('SuperGiftTimeList'))
|
| | | totalDay = superGiftTimeDict.get(giftID, 0)
|
| | | if not totalDay:
|
| | | return
|
| | | curTime = int(time.time())
|
| | | if (curTime - startTime)/86400 >= totalDay:
|
| | | #已结束
|
| | | return
|
| | | return True
|
| | |
|
| | | ## 商店npcid
|
| | | # @param curPlayer 玩家实例
|
| | |
| | |
|
| | | 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 玩家实例
|
| | |
| | | # @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
|
| | |
|
| | |
| | | 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 返回值真, 检查通过
|