#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # #------------------------------------------------------------------------------- # ##@package GameWorldActionTeHui # # @todo:ÌØ»Ý»î¶¯ # @author hxp # @date 2014-06-21 # @version 1.7 # # @change: "2014-09-28 17:30" hxp Ôö¼Ó³äÖµÅÅÐл´¦Àí # @change: "2014-10-11 12:30" hxp ÐÞ¸´³äÖµÅÅÐн±ÀøÖ»ÄܸøÇ°Á½ÃûµÄbug # @change: "2014-12-06 16:30" hxp Ôö¼ÓºÏ·þÕÛ¿ÛµêÖ§³Ö£¬Ôö¼ÓGMÖØÖÃÌØ»Ý»î¶¯Êý¾Ý(·½±ã²âÊÔ) # @change: "2014-12-11 22:00" hxp ÐÞ¸Äͬ²½µØÍ¼ÕÛ¿Û״̬Âß¼­(È¡²»µ½ÖµÊ±²ÅȡͨÓüǼÖеÄÖµ) # @change: "2015-08-21 14:30" hxp Ôö¼Ó¼Ç¼ÉÏÒ»ÆÚ³äÖµÌØ»ÝÅÅÐаñ°ñµ¥ÐÅÏ¢ # @change: "2017-03-24 15:00" hxp Æô¶¯Ê±³õʼ»¯»î¶¯Êý¾Ý״ֵ̬ # @change: "2017-06-14 11:00" hxp »¹Ô­ÌØ»ÝÏû·Ñ·µÀû°ñ # # ÏêϸÃèÊö: ÌØ»Ý»î¶¯ # #--------------------------------------------------------------------- """Version = 2017-06-14 11:00""" import GameWorld import ShareDefine import ChPyNetSendPack import NetPackCommon import GameWorldShopItem import PlayerDBGSEvent import PlayerCompensation import PlayerBillboard import DataRecordPack import ReadChConfig import ChConfig ## GMÖØÖÃÌØ»ÝÊý¾Ý£¬·½±ã²âÊÔ # @param None # @return None def OnGMClearTeHui(): # Çå³ý³äÖµÌØ»ÝÅÅÐаñ PlayerBillboard.ClearBillboardByIndex(ShareDefine.Def_BT_RechargeTeHui) PlayerBillboard.ClearBillboardByIndex(ShareDefine.Def_BT_RechargeTeHuiLast) # Çå³ýÏû·ÑÌØ»ÝÅÅÐаñ PlayerBillboard.ClearBillboardByIndex(ShareDefine.Def_BT_CostTeHui) PlayerBillboard.ClearBillboardByIndex(ShareDefine.Def_BT_CostTeHuiLast) gameWorld = GameWorld.GetGameWorld() for dictName in ShareDefine.TeHuiTypeKeyDict.values(): beginTime, endTime = 0, 0 signID = 0 #DZ¹æÔò£ºÔÚChConfig»î¶¯Ïà¹ØÉèÖÃÖУ¬ÌáÈ¡ÁË×ÖµäÃû gameWorld.SetDict(dictName, signID) gameWorld.SetDict(ShareDefine.Def_Notify_WorldKey_DayAction_BeginTime % dictName, beginTime) gameWorld.SetDict(ShareDefine.Def_Notify_WorldKey_DayAction_EndTime % dictName, endTime) # ±ê¼Ç»î¶¯Î¨Ò»id actionIDKey = ShareDefine.Def_Notify_WorldKey_DayAction_ID % dictName gameWorld.SetDict(actionIDKey, beginTime) #֪ͨMapserver,ÉèÖÃ×Öµä GameWorld.SendMapServerMsgEx(actionIDKey, beginTime) GameWorld.SendMapServerMsgEx(dictName, signID) PlayerDBGSEvent.SetDBGSTrig_ByKey(actionIDKey, beginTime) PlayerDBGSEvent.SetDBGSTrig_ByKey(dictName, signID) PlayerDBGSEvent.SetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_DayAction_BeginTime % dictName, beginTime) PlayerDBGSEvent.SetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_DayAction_EndTime % dictName, endTime) PlayerDBGSEvent.DelDBGSTrig_ByKey(PlayerDBGSEvent.Def_TeHuiRepeatOrderKey) PlayerDBGSEvent.DelDBGSTrig_ByKey(PlayerDBGSEvent.Def_TeHuiRepeatNumKey) return def OnGameServerInitOK(): # ¶ÁÈ¡Êý¾Ý¿âÖеÄÖµ³õʼ»¯µ½ÄÚ´æÖÐ GameWorld.Log("³õʼ»¯Ìػݻֵ...") gameWorld = GameWorld.GetGameWorld() for dictName in ShareDefine.TeHuiTypeKeyDict.values(): actionIDKey = ShareDefine.Def_Notify_WorldKey_DayAction_ID % dictName beginTimeKey = ShareDefine.Def_Notify_WorldKey_DayAction_BeginTime % dictName endTimeKey = ShareDefine.Def_Notify_WorldKey_DayAction_EndTime % dictName actionValue = PlayerDBGSEvent.GetDBGSTrig_ByKey(dictName) actionID = PlayerDBGSEvent.GetDBGSTrig_ByKey(actionIDKey) beginTime = PlayerDBGSEvent.GetDBGSTrig_ByKey(beginTimeKey) endTIme = PlayerDBGSEvent.GetDBGSTrig_ByKey(endTimeKey) gameWorld.SetDict(dictName, actionValue) gameWorld.SetDict(actionIDKey, actionID) gameWorld.SetDict(beginTimeKey, beginTime) gameWorld.SetDict(endTimeKey, endTIme) GameWorld.Log(" dictName=%s,actionValue=%s,actionID=%s,beginTime=%s,endTIme=%s" % (dictName, actionValue, actionID, beginTime, endTIme)) return def OnMapServerInitOK(): SendTeHuiActionInfo() return ## ·¢ËÍMapServerÌØ»Ý»î¶¯ÐÅÏ¢ # @param None # @return None def SendTeHuiActionInfo(): gameWorld = GameWorld.GetGameWorld() for actionKey in ShareDefine.TeHuiTypeKeyDict.values(): actionIDKey = ShareDefine.Def_Notify_WorldKey_DayAction_ID % actionKey actionID = gameWorld.GetDictByKey(actionIDKey) actionValue = gameWorld.GetDictByKey(actionKey) # Èç¹ûûÓÐÖµ£¬ÔòÈ¡¼Ç¼ÖеÄÖµ if actionID <= 0: actionID = PlayerDBGSEvent.GetDBGSTrig_ByKey(actionIDKey) actionValue = PlayerDBGSEvent.GetDBGSTrig_ByKey(actionKey) GameWorld.SendMapServerMsgEx(actionIDKey, actionID) GameWorld.SendMapServerMsgEx(actionKey, actionValue) return ## ÌØ»Ý»î¶¯±ä¸ü´¦Àí # @param dictName »î¶¯key # @param value Öµ # @return None def OnTeHuiActionChange(dictName, value): gameWorld = GameWorld.GetGameWorld() actionIDKey = ShareDefine.Def_Notify_WorldKey_DayAction_ID % dictName startTimeKey = ShareDefine.Def_Notify_WorldKey_DayAction_BeginTime % dictName endTimeKey = ShareDefine.Def_Notify_WorldKey_DayAction_EndTime % dictName curActionID = gameWorld.GetDictByKey(actionIDKey) dbActionID = PlayerDBGSEvent.GetDBGSTrig_ByKey(actionIDKey) dbStartTime = PlayerDBGSEvent.GetDBGSTrig_ByKey(startTimeKey) dbEndTime = PlayerDBGSEvent.GetDBGSTrig_ByKey(endTimeKey) dbActionValue = PlayerDBGSEvent.GetDBGSTrig_ByKey(dictName) # Èç¹û²»ÊÇͬһ»î¶¯ID£¬Ôò¸üб£´æ GameWorld.Log("OnTeHuiActionChange dictName=%s,value=%s,dbActionValue=%s,curActionID=%s,dbActionID=%s" % (dictName, value, dbActionValue, curActionID, dbActionID)) if curActionID != dbActionID: PlayerDBGSEvent.SetDBGSTrig_ByKey(actionIDKey, curActionID) curStartTime = gameWorld.GetDictByKey(startTimeKey) curEndTime = gameWorld.GetDictByKey(endTimeKey) PlayerDBGSEvent.SetDBGSTrig_ByKey(startTimeKey, curStartTime) PlayerDBGSEvent.SetDBGSTrig_ByKey(endTimeKey, curEndTime) PlayerDBGSEvent.SetDBGSTrig_ByKey(dictName, value) GameWorld.Log(" »î¶¯ID²»Ò»Ñù£¬¸üÐÂDBGSTrig...curActionID=%s,sTime=%s,eTime=%s,value=%s" % (curActionID, curStartTime, curEndTime, value)) # Èç¹ûÊÇÕۿ۵꣬ÔòÐèÒªÖØÖÃÈ«·þÏÞ¹ºÊý¾Ý if dictName in [ShareDefine.Def_Notify_WorldKey_DayAction_DiscountShop, ShareDefine.Def_Notify_WorldKey_DayAction_MixDiscountShop]: GameWorldShopItem.DoShopItemClearBuyCnt(value) GameWorld.Log(" ÕÛ¿ÛµêлID¿ªÆô£¬ÖØÖÃÈ«·þÏÞ¹º´ÎÊý£¡shopID=%s" % value) # ³äÖµÅÅÐÐÌØ»Ý elif dictName == ShareDefine.Def_Notify_WorldKey_DayAction_RechargeRank: # ¿½±´ÕâÒ»ÆÚµÄ×îÖÕ½á¹û±¸µµ PlayerBillboard.CopyBillboard(ShareDefine.Def_BT_RechargeTeHuiLast, ShareDefine.Def_BT_RechargeTeHui) DataRecordPack.DR_BillboardDataByDay(ShareDefine.Def_BT_RechargeTeHui) GameWorld.Log(" ³äÖµÅÅÐÐÌØ»Ý ¿½±´ÀúÊ·»î¶¯Êý¾Ý±¸µµ¡£¡£.") # ·¢Ëͽ±ÀøÓʼþ __DoSendRechargeRankTeHuiRewardMail(dbActionID, dbActionValue, dbStartTime, dbEndTime) GameWorld.Log(" ³äÖµÅÅÐÐÌØ»Ý ·¢Ëͽ±ÀøÓʼþ¡£¡£.") # Èç¹û¿ªÆôеÄÒ»ÆÚ£¬ÔòÖØÖÃÐÂÒ»ÆÚÅÅÐаñ if value > 0: PlayerBillboard.ClearBillboardByIndex(ShareDefine.Def_BT_RechargeTeHui) GameWorld.Log(" ³äÖµÅÅÐÐÌØ»Ý ÖØÖÃÐÂÒ»ÆÚÅÅÐаñ¡£¡£.") # Ïû·ÑÌØ»ÝÅÅÐаñ elif dictName == ShareDefine.Def_Notify_WorldKey_DayAction_CostRank: # ¿½±´ÕâÒ»ÆÚµÄ×îÖÕ½á¹û±¸µµ PlayerBillboard.CopyBillboard(ShareDefine.Def_BT_CostTeHuiLast, ShareDefine.Def_BT_CostTeHui) DataRecordPack.DR_BillboardDataByDay(ShareDefine.Def_BT_CostTeHui) __DoSendCostRankTeHuiRewardMail(dbActionID, dbActionValue, dbStartTime, dbEndTime) if value > 0: PlayerBillboard.ClearBillboardByIndex(ShareDefine.Def_BT_CostTeHui) Sync_TeHuiActivityToClient(None, 0) return ## Ö´Ðз¢ËÍÏû·ÑÌØ»ÝÅÅÐаñÓʼþ # @param None # @return None def __DoSendCostRankTeHuiRewardMail(dbActionID, dbActionValue, dbStartTime, dbEndTime): GameWorld.Log("Ö´Ðз¢ËÍÏû·ÑÌØ»ÝÅÅÐаñÓʼþ...dbActionID=%s,dbActionValue=%s,dbStartTime=%s,dbEndTime=%s" % (dbActionID, dbActionValue, dbStartTime, dbEndTime)) # ·¢Ëͽ±ÀøÓʼþ billboard = GameWorld.GetBillboard().FindBillboard(ShareDefine.Def_BT_CostTeHui) if not billboard: GameWorld.ErrLog(" ÕÒ²»µ½Ïû·ÑÌØ»ÝÅÅÐаñ!!!") return costRankInfoDict = ReadChConfig.GetEvalChConfig("TeHuiAction_CostRank") if dbActionValue not in costRankInfoDict: GameWorld.ErrLog(" »î¶¯±àºÅ²»ÔÚÅÅÐн±ÀøÅäÖÃÀ±àºÅ=%s" % (dbActionValue)) return costRankInfoList = costRankInfoDict[dbActionValue] if len(costRankInfoList) < 5: GameWorld.ErrLog(" ÅÅÐн±ÀøÅäÖÃÐÅÏ¢´íÎó!!!") return startTimeStr = GameWorld.ChangeTimeNumToStr(dbStartTime) endTimeStr = GameWorld.ChangeTimeNumToStr(dbEndTime) rewardMailInfoList = costRankInfoList[1:] mailTitle, contentTemple, getDays, rewardDict = rewardMailInfoList mailLimitTime = str(GameWorld.GetDatetimeByDiffDays(getDays)) mailLimitTime = mailLimitTime.split(".")[0] billboardCnt = billboard.GetCount() #maxOrder = max(rewardDict) for index in range(0, billboardCnt): #if index < 0 or index >= billboardCnt: # continue objBillboard = billboard.At(index) playerID = objBillboard.GetID() curJob = objBillboard.GetType2() curJobType = ChConfig.JOB_TYPE_DICT.get(curJob) # »ñȡְҵ´óÀà jobRewardDict = __GetAwardByJob(curJobType, rewardDict) if not jobRewardDict: GameWorld.ErrLog("Ïû·ÑÅÅÐÐÌØ»Ý ·¢Ëͽ±Àø£¬ÕÒ²»µ½Ö°Òµ¶ÔÓ¦½±ÀøÅäÖÃ, jobType=%s" % curJobType) continue order = index + 1 rewardItemList = GameWorld.GetDictValueByRangeKey(jobRewardDict, order) if not rewardItemList: GameWorld.ErrLog("Ïû·ÑÅÅÐÐÌØ»Ý ·¢Ëͽ±Àø£¬order=%s not in jobRewardDict=%s" % (order, str(jobRewardDict))) continue mailContent = contentTemple % (startTimeStr, endTimeStr, order) GUID = PlayerCompensation.SendPersonalItemMail(mailTitle, mailContent, mailLimitTime, [playerID], rewardItemList) DataRecordPack.DR_SendCostRankTeHuiRewardMail(playerID, GUID, dbActionID, dbActionValue, order, rewardItemList) return ## Ö´Ðз¢ËͳäÖµÅÅÐн±ÀøÓʼþ # @param None # @return None def __DoSendRechargeRankTeHuiRewardMail(dbActionID, dbActionValue, dbStartTime, dbEndTime): GameWorld.Log("Ö´Ðз¢ËͳäÖµÅÅÐн±ÀøÓʼþ...dbActionID=%s,dbActionValue=%s,dbStartTime=%s,dbEndTime=%s" % (dbActionID, dbActionValue, dbStartTime, dbEndTime)) # ·¢Ëͽ±ÀøÓʼþ billboard = GameWorld.GetBillboard().FindBillboard(ShareDefine.Def_BT_RechargeTeHui) if not billboard: GameWorld.ErrLog(" ÕÒ²»µ½³äÖµÅÅÐаñ!!!") return RechargeRankInfoDict = ReadChConfig.GetEvalChConfig("TeHuiAction_RechargeRank") if dbActionValue not in RechargeRankInfoDict: GameWorld.ErrLog(" »î¶¯±àºÅ²»ÔÚÅÅÐн±ÀøÅäÖÃÀ±àºÅ=%s" % (dbActionValue)) return rechargeRankInfoList = RechargeRankInfoDict[dbActionValue] if len(rechargeRankInfoList) < 5: GameWorld.ErrLog(" ÅÅÐн±ÀøÅäÖÃÐÅÏ¢´íÎó!!!") return startTimeStr = GameWorld.ChangeTimeNumToStr(dbStartTime) endTimeStr = GameWorld.ChangeTimeNumToStr(dbEndTime) rewardMailInfoList = rechargeRankInfoList[1:] mailTitle, contentTemple, getDays, rewardDict = rewardMailInfoList mailLimitTime = str(GameWorld.GetDatetimeByDiffDays(getDays)) mailLimitTime = mailLimitTime.split(".")[0] billboardCnt = billboard.GetCount() #maxOrder = max(rewardDict) for index in range(0, billboardCnt): #if index < 0 or index >= billboardCnt: # continue objBillboard = billboard.At(index) playerID = objBillboard.GetID() curJob = objBillboard.GetType2() curJobType = ChConfig.JOB_TYPE_DICT.get(curJob) # »ñȡְҵ´óÀà jobRewardDict = __GetAwardByJob(curJobType, rewardDict) if not jobRewardDict: GameWorld.ErrLog("³äÖµÅÅÐÐÌØ»Ý ·¢Ëͽ±Àø£¬ÕÒ²»µ½Ö°Òµ¶ÔÓ¦½±ÀøÅäÖÃ, jobType=%s" % curJobType) continue order = index + 1 rewardItemList = GameWorld.GetDictValueByRangeKey(jobRewardDict, order) if not rewardItemList: GameWorld.ErrLog("³äÖµÅÅÐÐÌØ»Ý ·¢Ëͽ±Àø£¬order=%s not in jobRewardDict=%s" % (order, str(jobRewardDict))) continue mailContent = contentTemple % (startTimeStr, endTimeStr, order) GUID = PlayerCompensation.SendPersonalItemMail(mailTitle, mailContent, mailLimitTime, [playerID], rewardItemList) DataRecordPack.DR_SendRechareRankTeHuiRewardMail(playerID, GUID, dbActionID, dbActionValue, order, rewardItemList) return ## ¸ù¾ÝÖ°Òµ»ñÈ¡½±Àø # @param curPlayer£ºÍæ¼ÒʵÀý # @param qqRewardDict£º½±ÀøÎïÆ·ÅäÖÃ×Öµä # @return None def __GetAwardByJob(jobtype, rewardDict): if jobtype in rewardDict: return rewardDict[jobtype] infoKey = () # ĬÈÏkey for jobkey in rewardDict.keys(): # Èç¹ûÍæ¼ÒÖ°ÒµÔÚÅäÖõÄkeyÀÔòȡָ¶¨µÄkeyÐÅÏ¢ if isinstance(jobkey, tuple) and jobtype in jobkey: infoKey = jobkey break return rewardDict.get(infoKey) ## ²éÑ¯ÌØ»Ý»î¶¯ÐÅÏ¢ # @param index Íæ¼ÒʵÀý # @param clientData ·â°ü½á¹¹Ìå # @param tick ʱ¼ä´Á # @return None def ClientRequestTeHuiActivity(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) activityType = clientData.ActivityType GameWorld.DebugLog("ClientRequestTeHuiActivity activityType=%s" % activityType) Sync_TeHuiActivityToClient(curPlayer, activityType) return ## ͬ²½ÌػݻÐÅÏ¢ # @param curPlayer # @param tick ʱ¼ä´Á # @return None def Sync_TeHuiActivityToClient(curPlayer, activityType): gameWorld = GameWorld.GetGameWorld() tehuiPack = ChPyNetSendPack.tagGCTeHuiActivityInfoList() tehuiPack.Clear() tehuiPack.ActivityInfoList = [] for teHuiType, dictKey in ShareDefine.TeHuiTypeKeyDict.items(): if activityType not in [0, teHuiType]: continue tehuiInfo = ChPyNetSendPack.tagGCTeHuiActivityInfo() tehuiInfo.Clear() tehuiInfo.ActivityType = teHuiType tehuiInfo.ActivityValue = gameWorld.GetDictByKey(dictKey) startTime = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_DayAction_BeginTime % dictKey) tehuiInfo.StartDate = startTime endTime = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_DayAction_EndTime % dictKey) tehuiInfo.EndDate = endTime tehuiPack.ActivityInfoList.append(tehuiInfo) tehuiPack.ActivityCount = len(tehuiPack.ActivityInfoList) # ֪ͨ¿Í»§¶Ëͬ²½Ê±¼ä if not curPlayer: # È«·þ¹ã²¥ÔÚÏßÍæ¼Ò playerManager = GameWorld.GetPlayerManager() for i in range(0, playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(i) if curPlayer == None or not curPlayer.GetInitOK(): continue NetPackCommon.SendFakePack(curPlayer, tehuiPack) else: NetPackCommon.SendFakePack(curPlayer, tehuiPack) return