#!/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
|
|