From 43a9e6c87a5a4980902e86eb0470d885b1a3fb8f Mon Sep 17 00:00:00 2001 From: xdh <xiefantasy@qq.com> Date: 星期一, 22 十月 2018 21:23:02 +0800 Subject: [PATCH] 4282 【主干】【1.1.0】【后端】新增物品效果:获得X法宝X经验 --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py | 192 +++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 166 insertions(+), 26 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 35ba93f..421db9c 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 @@ -57,13 +57,14 @@ import PlayerControl import ItemCommon import ShareDefine -import DataRecordPack -import EventSrc +import PlayerFlashSale +#import EventSrc import ChItem import IpyGameDataPY import PlayerRune -import PlayerSuccess +import GameFuncComm import PlayerFairyCeremony +import PlayerSpringSale import PyGameData import random @@ -191,6 +192,7 @@ ## 登录 def ShopItemOnLogin(curPlayer): SyncShopItemTodayBuyCount(curPlayer) + SyncSuperGiftInfo(curPlayer) return ##商店物品OnDay @@ -198,6 +200,9 @@ # @return def ShopItemOnDay(curPlayer, onEventType): if onEventType == ShareDefine.Def_OnEventType: + UpdataSuperGiftTime(curPlayer, True) + SyncSuperGiftInfo(curPlayer) + OSSaleOpenMail(curPlayer) refreshType = [3] elif onEventType == ShareDefine.Def_OnEventTypeEx: refreshType = [4] @@ -335,19 +340,33 @@ if not ipyData: return shopType = ipyData.GetShopType() - - if ipyData.GetOperationActionShop(): + operationActionShopType = ipyData.GetOperationActionShop() + if operationActionShopType == 1: actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_SpringSale, {}) state = actInfo.get(ShareDefine.ActKey_State, 0) if not state: GameWorld.DebugLog("限时特惠非活动中!state=%s" % (state), curPlayer.GetPlayerID()) return - shopTypeList = actInfo.get(ShareDefine.ActKey_ShopTypeList, []) + shopTypeList = PlayerSpringSale.GetShopTypeList(actInfo.get(ShareDefine.ActKey_CfgID, 0), actInfo.get(ShareDefine.ActKey_DayIndex, 0)) if not shopTypeList: return actShopType = shopTypeList[-1] if state > len(shopTypeList) else shopTypeList[state - 1] if shopType != actShopType: GameWorld.DebugLog("限时特惠非活动中的商店类型!state=%s,shopType=%s,actShopType=%s,shopTypeList=%s" + % (state, shopType, actShopType, shopTypeList), curPlayer.GetPlayerID()) + return + elif operationActionShopType == 2: + actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashSale, {}) + state = actInfo.get(ShareDefine.ActKey_State, 0) + if not state: + GameWorld.DebugLog("限时抢购非活动中!state=%s" % (state), curPlayer.GetPlayerID()) + return + shopTypeList = PlayerFlashSale.GetShopTypeList(actInfo.get(ShareDefine.ActKey_CfgID, 0), actInfo.get(ShareDefine.ActKey_DayIndex, 0), state) + if not shopTypeList: + return + actShopType = shopTypeList[0] + if shopType != actShopType: + GameWorld.DebugLog("限时抢购非活动中的商店类型!state=%s,shopType=%s,actShopType=%s,shopTypeList=%s" % (state, shopType, actShopType, shopTypeList), curPlayer.GetPlayerID()) return @@ -376,7 +395,7 @@ if limitBuyCnt == -1: GameWorld.DebugLog(" vip%s才能购买"%viplv) return - + curDayBuyCnt = 0 dayBuyCntKey = ChConfig.Def_PDict_ShopItemDayBuyCnt % itemIndex if limitBuyCnt > 0: @@ -389,7 +408,10 @@ GameWorld.DebugLog("BuyShopItem 修正购买次数!shopType=%s,itemIndex=%s,clientBuyCount=%s,canBuyCnt=%s" % (shopType, itemIndex, clientBuyCount, canBuyCnt)) clientBuyCount = canBuyCnt - + serverLimitCnt = ipyData.GetServerLimitCnt() + if serverLimitCnt > 0: + clientBuyCount = min(serverLimitCnt, clientBuyCount) + itemID, itemCount, isBind = ipyData.GetItemID(), ipyData.GetItemCnt(), ipyData.GetIsBind() itemListEx = ipyData.GetItemListEx() priceType, itemPrice = ipyData.GetMoneyType(), ipyData.GetMoneyNum() @@ -418,8 +440,8 @@ if not curItem: GameWorld.ErrLog("Store shop item error! shopType=%s,itemID=%s" % (shopType, itemID)) return - packType = ShareDefine.rptRune if curItem.GetType() == ChConfig.Def_ItemType_Rune else IPY_GameWorld.rptItem - needSpace = int(math.ceil(float(itemCnt) / curItem.GetPackCount())) + packType = ChConfig.GetItemPackType(curItem.GetType()) + needSpace = ItemControler.GetItemNeedPackCount(packType, curItem, itemCnt) needPackSpaceDict[packType] = needPackSpaceDict.get(packType, 0) + needSpace if i == 0: @@ -430,30 +452,62 @@ GameWorld.DebugLog("购买物品: shopType=%s,itemIndex=%s,clientBuyCount=%s,totalItemList=%s,mainItemID=%s,needPackSpaceDict=%s" % (shopType, itemIndex, clientBuyCount, totalItemList, mainItemID, needPackSpaceDict), curPlayer.GetPlayerID()) - + mailKey = ipyData.GetMailKey() + isLackPack = False #是否背包不足 for packType, needSpace in needPackSpaceDict.items(): if needSpace > ItemCommon.GetItemPackSpace(curPlayer, packType, needSpace): - curPlayer.ShopResult(itemIndex, IPY_GameWorld.tsrNoPlace) - PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165", [packType]) - return + isLackPack = True + if mailKey: + break + else: + curPlayer.ShopResult(itemIndex, IPY_GameWorld.tsrNoPlace) + PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165", [packType]) + return + sendMailKey = mailKey if isLackPack and mailKey else '' #背包不足且配置了mailKey的才发邮件 # 购买限制条件扩展 if CheckBuyItemLimitEx(curPlayer, shopType, itemIndex, mainItemID, ipyData.GetLimitValue()): GameWorld.Log("Store shop item buy limit! shopType=%s,itemIndex=%s,limitValue=%s" % (shopType, itemIndex, ipyData.GetLimitValue()), curPlayer.GetPlayerID()) return + if not PlayerControl.HaveMoney(curPlayer, priceType, itemPrice): + curPlayer.ShopResult(itemIndex, IPY_GameWorld.tsrNoMoney) + return + if serverLimitCnt > 0: #全服限购判断放到最后面,GameServer直接加次数 + if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_StoreQueryState) == 1: + #已经在查询中, 不重复查询 + GameWorld.DebugLog("全服购买次数已经在查询中, 不重复查询 itemIndex=%s" % itemIndex) + return + cmdStr = '%s' % ([itemIndex, serverLimitCnt, clientBuyCount, totalItemList, mainItemID, limitBuyCnt, sendMailKey]) + GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, + "GetStoreServerBuyCnt", cmdStr, len(cmdStr)) + #设置状态查询中 + curPlayer.SetDict(ChConfig.Def_PlayerKey_StoreQueryState, 1) + return #-------------------------开始购买物品----------------------------- + DoBuyStoreItem(curPlayer, itemIndex, clientBuyCount, totalItemList, mainItemID, limitBuyCnt, sendMailKey, ipyData) + + return + +def DoBuyStoreItem(curPlayer, itemIndex, clientBuyCount, totalItemList, mainItemID, limitBuyCnt, sendMailKey, ipyData=None): + if not ipyData: + ipyData = IpyGameDataPY.GetIpyGameData("Store", itemIndex) + priceType, itemPrice = ipyData.GetMoneyType(), ipyData.GetMoneyNum() + itemPrice *= clientBuyCount + shopType = ipyData.GetShopType() + beforeMoney = PlayerControl.GetMoney(curPlayer, priceType) infoDict = {"TotalItemList":totalItemList, "ClientBuyCount":clientBuyCount, "ShopType":shopType, "ShopItemIndex":itemIndex, ChConfig.Def_Cost_Reason_SonKey:mainItemID} - if not PlayerControl.PayMoney(curPlayer, priceType, itemPrice, ChConfig.Def_Cost_BuyStoreItem, infoDict, clientBuyCount): - curPlayer.ShopResult(itemIndex, IPY_GameWorld.tsrNoMoney) - return + PlayerControl.PayMoney(curPlayer, priceType, itemPrice, ChConfig.Def_Cost_BuyStoreItem, infoDict, clientBuyCount) + afterMoney = PlayerControl.GetMoney(curPlayer, priceType) # 今日购买次数+1 if limitBuyCnt > 0: + dayBuyCntKey = ChConfig.Def_PDict_ShopItemDayBuyCnt % itemIndex + curDayBuyCnt = curPlayer.NomalDictGetProperty(dayBuyCntKey) PlayerControl.NomalDictSetProperty(curPlayer, dayBuyCntKey, curDayBuyCnt + clientBuyCount) SyncShopItemTodayBuyCount(curPlayer, [itemIndex]) @@ -461,29 +515,34 @@ "ItemPrice":itemPrice, "MoneyType":priceType, "BeforeMoney":beforeMoney, "AfterMoney":afterMoney} isForceEvent = priceType not in [IPY_GameWorld.TYPE_Price_Silver_Money] - + itemControl = ItemControler.PlayerItemControler(curPlayer) for itemID, itemCount, isBind in totalItemList: curItemObj = ItemControler.GetOutPutItemObj(itemID, itemCount, isBind) if not curItemObj: continue userData = curItemObj.GetUserData() - packType = ShareDefine.rptRune if curItemObj.GetType() == ChConfig.Def_ItemType_Rune else IPY_GameWorld.rptItem - if not itemControl.PutInItem(packType, curItemObj, event=[ChConfig.ItemGive_BuyItem, isForceEvent, dataDict]): + if not sendMailKey: + packType = ChConfig.GetItemPackType(curItemObj.GetType()) + if not itemControl.PutInItem(packType, curItemObj, event=[ChConfig.ItemGive_BuyItem, isForceEvent, dataDict]): + curItemObj.Clear() + continue + else: curItemObj.Clear() - continue - EventShell.EventRespons_BuyItem(curPlayer, itemID, itemCount) if ipyData.GetNotifyMark() and itemID == mainItemID: PlayerControl.WorldNotify(0, ipyData.GetNotifyMark(), [curPlayer.GetName(), mainItemID, userData]) - + 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 dict(IpyGameDataPY.GetFuncEvalCfg('SuperGiftTimeList')): + UpdataSuperGiftTime(curPlayer) return def __GetShopJobItem(job, itemID, jobItemList): @@ -521,12 +580,16 @@ if curFamilyLV <= 0: curFamilyLV = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyLV) return curFamilyLV < limitValue - if shopNPCID in [15]: # 限时特惠商店 - playerCreateRoleDays = GameWorld.GetCreateRoleDays(curPlayer) - return playerCreateRoleDays != limitValue + if shopNPCID in [15]: # 开服特惠商店 + #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 dict(IpyGameDataPY.GetFuncEvalCfg('SuperGiftTimeList')): + return not CheckSuperGiftBuy(curPlayer, itemIndex) # # limitPlusDict = {shopItem.GetLimitPlusType1():shopItem.GetLimitPlusValue1(), # shopItem.GetLimitPlusType2():shopItem.GetLimitPlusValue2(), @@ -553,6 +616,83 @@ # 默认不限制 return False +def OSSaleOpenMail(curPlayer): + #开服特惠开启邮件 + if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_OSSail): + return + openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)+1 + if openServerDay not in IpyGameDataPY.GetFuncEvalCfg('OSSaleOpenMail'): + return + addItemList = IpyGameDataPY.GetFuncEvalCfg('OSSaleOpenMail', 2) + PlayerControl.SendMailByKey('SellMail1', [curPlayer.GetID()], addItemList) + return + +#超值礼包购买时间 +def UpdataSuperGiftTime(curPlayer, isOnday=False): + superGiftData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SuperGiftData) + giftIndex, startDay = superGiftData%10, superGiftData/10 + superGiftTimeList = IpyGameDataPY.GetFuncEvalCfg('SuperGiftTimeList') + if giftIndex >= len(superGiftTimeList): + return + if isOnday and not giftIndex: + return + openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)+1 + newIndex = giftIndex + if isOnday: + lastDays = 0 + pastDay = openServerDay - startDay + for i in xrange(giftIndex-1, len(superGiftTimeList)): + lastDays += superGiftTimeList[i][1] + if pastDay < lastDays: + break + if pastDay >= lastDays: + newIndex = i+2 + + else: + newIndex = min(len(superGiftTimeList), giftIndex+1) + + if newIndex == giftIndex: + return + + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SuperGiftData, openServerDay*10+newIndex) + #通知 + if not isOnday: + SyncSuperGiftInfo(curPlayer) + if newIndex == 1: + addItemList = IpyGameDataPY.GetFuncEvalCfg('SuperGiftTimeList', 2) + PlayerControl.SendMailByKey('SellMail2', [curPlayer.GetID()], addItemList) + return True + +def SyncSuperGiftInfo(curPlayer): + superGiftData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SuperGiftData) + giftIndex, startDay = superGiftData%10, superGiftData/10 + superGiftTimeList = IpyGameDataPY.GetFuncEvalCfg('SuperGiftTimeList') + if giftIndex == 0 or giftIndex > len(superGiftTimeList): + return + giftID, day = superGiftTimeList[giftIndex-1] + openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)+1 + remainDay = max(0, day - openServerDay+startDay)-1 + + packData = ChPyNetSendPack.tagMCSuperGiftInfo() + packData.GiftID = giftID + packData.EndtDate = str(GameWorld.GetDatetimeByDiffDays(remainDay))[:10] + NetPackCommon.SendFakePack(curPlayer, packData) + return +def CheckSuperGiftBuy(curPlayer, giftID): + #超值礼包是否可购买 + superGiftData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SuperGiftData) + giftIndex, startDay = superGiftData%10, superGiftData/10 + superGiftTimeList = IpyGameDataPY.GetFuncEvalCfg('SuperGiftTimeList') + if giftIndex == 0 or giftIndex > len(superGiftTimeList): + return + curGiftID, day = superGiftTimeList[giftIndex-1] + if giftID != curGiftID: + return + openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)+1 + if not max(0, day - openServerDay+startDay): + return + return True + ## 商店npcid # @param curPlayer 玩家实例 # @return -- Gitblit v1.8.0