#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#---------------------------------------------------------------------
|
#
|
#---------------------------------------------------------------------
|
##@package PlayerFamilyRedPacket
|
# @todo: Íæ¼Ò¼Ò×åºì°ü
|
#
|
# @author: xdh
|
# @date 2017-08-31
|
# @version 1.0
|
#
|
#---------------------------------------------------------------------
|
#"""Version = 2017-08-31 16:00"""
|
#---------------------------------------------------------------------
|
import GameWorld
|
import PlayerControl
|
import ChConfig
|
import IpyGameDataPY
|
import IPY_GameWorld
|
import ChPyNetSendPack
|
import PlayerFeastRedPacket
|
import NetPackCommon
|
import PlayerVip
|
import ShareDefine
|
|
import time
|
#---------------------------------------------------------------------
|
|
(
|
State_NoSend, #δ·¢
|
State_NoGot, #δÁìÈ¡
|
State_HasGot, #ÒÑÁìÈ¡
|
State_HasAllGot, #È«²¿ÁìÍê
|
) = range(4)
|
|
|
## Íæ¼ÒµÇ¼
|
def OnPlayerLogin(curPlayer):
|
__NotifyGoldLimt(curPlayer)
|
NotifyOSRedPacket(curPlayer)
|
return
|
|
## OnDay´¦Àí
|
# @param curPlayer
|
# @return None
|
def RedPacketOnDay(curPlayer, onEventType):
|
if onEventType == ShareDefine.Def_OnEventType:
|
#·¢×êʯºì°ü¶î¶ÈÖØÖÃ
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyRedPacketGoldLimit, 0)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ServerRedPacketGrabCnt, 0)
|
__NotifyGoldLimt(curPlayer)
|
elif onEventType == ShareDefine.Def_OnEventTypeEx:
|
oscDay = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg')
|
openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)
|
if openServerDay < oscDay:
|
grabCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSRedPacketCanGrabCnt, 0)
|
sendCnt = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg', 5)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSRedPacketCanGrabCnt, grabCnt+sendCnt)
|
NotifyOSRedPacket(curPlayer)
|
return
|
|
def OnPlayerRecharge(curPlayer, orderRMB):
|
## Íæ¼Ò³äÖµ
|
|
todayCoin = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AllCoinToday)
|
# ÿÈÕÊ׳äºì°ü
|
if todayCoin - orderRMB * 100 == 0:
|
dayFirstRedPacketID = IpyGameDataPY.GetFuncCfg("RechargeRedPacket", 1)
|
GameWorld.DebugLog("ÿÈÕÊ׳äºì°ü: dayFirstRedPacketID=%s" % dayFirstRedPacketID)
|
if dayFirstRedPacketID:
|
CreatRedPacketByID(curPlayer, dayFirstRedPacketID)
|
#else:
|
# GameWorld.DebugLog("·ÇÿÈÕÊ׳ä: todayCoin=%s" % todayCoin)
|
|
# µ¥±Ê³äÖµºì°ü
|
rmbRedPacketID = 0
|
rmbRedPackIDDict = IpyGameDataPY.GetFuncEvalCfg("RechargeRedPacket", 2, {})
|
rmbList = rmbRedPackIDDict.keys()
|
rmbList.sort()
|
for rmb in rmbList:
|
if orderRMB <= rmb:
|
rmbRedPacketID = rmbRedPackIDDict[rmb]
|
break
|
|
if rmbRedPacketID:
|
GameWorld.DebugLog("µ¥±Ê³äÖµºì°ü: orderRMB=%s,rmbRedPacketID=%s" % (orderRMB, rmbRedPacketID))
|
CreatRedPacketByID(curPlayer, rmbRedPacketID)
|
return
|
|
def CreatCacheRedPacktet(curPlayer):
|
#¼ÓÈëÏÉÃ˺󣬷¢·Å´ý·¢µÄºì°ü
|
ipyMgr = IpyGameDataPY.IPY_Data()
|
for i in xrange(ipyMgr.GetFamilyRedPackCount()):
|
ipyData = ipyMgr.GetFamilyRedPackByIndex(i)
|
redPacketID = ipyData.GetID()
|
if GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_FamilyRedPacketCache, redPacketID):
|
CreatRedPacketByID(curPlayer, redPacketID)
|
GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_FamilyRedPacketCache, redPacketID, 0)
|
return
|
|
|
def CreatRedPacketByID(curPlayer, redPacketID, state=State_NoSend, data=0, wishInfo=""):
|
'''¸ù¾Ýºì°üIDÉú³Éºì°ü - Íⲿ¹¦Äܵ÷ÓýӿÚ
|
'''
|
ipyData = IpyGameDataPY.GetIpyGameData('FamilyRedPack', redPacketID)
|
if not ipyData:
|
return
|
getType = ipyData.GetGetType()
|
if not getType:
|
return
|
if getType == ShareDefine.RedPackType_OpenServer:
|
oscDay = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg')
|
openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)
|
if openServerDay >= oscDay:
|
GameWorld.DebugLog(' ·¢¿ª·þºì°ü,»î¶¯Òѹý£¬²»¿É·¢ËÍ£¡')
|
return
|
isFamilyRedPacket = False
|
elif getType == ShareDefine.RedPackType_FeastSucc:
|
if not PlayerFeastRedPacket.GetFeastRedPacketState():
|
GameWorld.DebugLog(' ·Ç½ÚÈÕºì°ü»î¶¯ÖУ¬²»¿É·¢ËÍ£¡')
|
return
|
isFamilyRedPacket = False
|
elif getType == ShareDefine.RedPackType_Server:
|
isFamilyRedPacket = False
|
else:
|
if not curPlayer.GetFamilyID():
|
#û¼Ò×å ÏÈ´æÆðÀ´£¬µÈ½øÏÉÃËʱÔÙ²¹·¢
|
GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_FamilyRedPacketCache, redPacketID, 1)
|
return
|
isFamilyRedPacket = True
|
|
__DoCreatRedPacket(curPlayer, getType, ipyData.GetMoneyType(), ipyData.GetMoneyNum(), ipyData.GetPacketCnt(), state, wishInfo, data, isFamilyRedPacket)
|
return
|
|
## Éú³Éºì°ü£¬×¢ÒâÍⲿ²»¿ÉÖ±½Óµ÷Óøú¯Êý
|
def __DoCreatRedPacket(curPlayer, getType, moneyType=2, awardNum=100, packetCnt=10, state=State_NoSend, wishInfo='', data=0, isFamilyRedPacket=True):
|
playerID = curPlayer.GetPlayerID()
|
packetCnt = min(packetCnt, awardNum)
|
|
if isFamilyRedPacket and not curPlayer.GetFamilyID():
|
GameWorld.DebugLog("Íæ¼ÒÎÞÏÉÃË£¬ÎÞ·¨·¢·Å¹éÊôÏÉÃ˵ĺì°ü!getType=%s" % (getType), playerID)
|
return
|
|
if getType == ShareDefine.RedPackType_GoldPacket:
|
goldLimit = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyRedPacketGoldLimit, 0)
|
familyRedPacketGoldLimit = IpyGameDataPY.GetFuncCfg('FamilyRedPacketGoldLimit')
|
if awardNum + goldLimit > familyRedPacketGoldLimit:
|
GameWorld.DebugLog(' Ö÷¶¯·¢ÏÉÃË×êʯºì°ü£¬¶î¶ÈÒѳ¬%s,²»¿É·¢ËÍ£¡' % familyRedPacketGoldLimit, playerID)
|
return
|
if not PlayerControl.HaveMoney(curPlayer, ShareDefine.TYPE_Price_BourseMoney, awardNum):
|
curBourseMoney = PlayerControl.GetMoney(curPlayer, ShareDefine.TYPE_Price_BourseMoney)
|
GameWorld.Log(" ²»ÄÜ·¢×êʯºì°ü no enough bourse money! priceCount=%s,curBourseMoney=%s"
|
% (awardNum, curBourseMoney), playerID)
|
return
|
if not PlayerControl.PayMoney(curPlayer, moneyType, awardNum, ChConfig.Def_Cost_FamilyRedPacket):
|
return
|
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyRedPacketGoldLimit, goldLimit + awardNum)
|
#֪ͨ
|
__NotifyGoldLimt(curPlayer)
|
# else:
|
# commonCntLimit = IpyGameDataPY.GetFuncCfg('FamilyRedPacketCnt')
|
# if packetCnt < commonCntLimit:
|
# GameWorld.DebugLog(' ·¢ÆÕͨÏÉÃ˺ì°ü£¬ÊýÁ¿²»ÄÜÉÙÓÚ%s£¡' % commonCntLimit, playerID)
|
# return
|
|
#֪ͨGameserverÉú³Éºì°ü
|
msg = str([playerID, getType, packetCnt, moneyType, awardNum, wishInfo, state, data, isFamilyRedPacket])
|
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "MapServer_CreatRedPacket", msg, len(msg))
|
GameWorld.DebugLog(' ֪ͨGameserverÉú³Éºì°ü msg=%s' % msg)
|
return
|
|
|
#// A6 08 ·¢¼Ò×åºì°ü #tagCMSendFamilyRedPacket
|
#
|
#struct tagCMSendFamilyRedPacket
|
#{
|
# tagHead Head;
|
# DWORD RedPacketID; // ºì°üID,ûÓз¢0
|
# WORD PacketCnt; // ºì°üÊýÁ¿
|
# WORD MoneyNum; //½ðÇ®ÊýÁ¿
|
# char Wish[33]; //×£¸£Óï
|
# BYTE IsAnonymous; //ÊÇ·ñÄäÃû
|
#};
|
## ·¢¼Ò×åºì°ü
|
def OnSendFamilyRedPacket(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
redPacketID = clientData.RedPacketID
|
packetCnt = clientData.PacketCnt
|
moneyNum = clientData.MoneyNum
|
wishInfo = clientData.Wish
|
isAnonymous = clientData.IsAnonymous
|
if not redPacketID:
|
#Ö÷¶¯·¢µÄ×êʯºì°ü vipÏÞÖÆ
|
if not PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_FamilyGoldPack):
|
GameWorld.DebugLog("Ö÷¶¯·¢µÄ×êʯºì°ü VIPȨÏÞ²»×ã")
|
return
|
__DoCreatRedPacket(curPlayer, ShareDefine.RedPackType_GoldPacket, IPY_GameWorld.TYPE_Price_Gold_Money, moneyNum, packetCnt, State_NoGot, wishInfo)
|
else:
|
# ×¢Ò⣺¸Ãº¯Êý·¢·ÅµÄÊÇÒÑ´´½¨µÄºì°ü£¬¸Ã²Ù×÷Ö»ÊǰѸúì°ü¿ª·Å¸øÍæ¼Ò¿ÉÇÀ
|
msg = str([curPlayer.GetPlayerID(), redPacketID, packetCnt, isAnonymous])
|
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "SendFamilyRedPacket", msg, len(msg))
|
return
|
|
|
|
## ֪ͨÇÀºì°ü×êʯ¶î¶È
|
def __NotifyGoldLimt(curPlayer):
|
packData = ChPyNetSendPack.tagMCFamilyRedPacketGoldLimit()
|
packData.Clear()
|
packData.HasSendGold = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyRedPacketGoldLimit, 0)
|
packData.ServerGrabCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ServerRedPacketGrabCnt)
|
NetPackCommon.SendFakePack(curPlayer, packData)
|
return
|
|
## ֪ͨÇÀºì°ü´ÎÊý
|
def NotifyOSRedPacket(curPlayer):
|
packData = ChPyNetSendPack.tagMCOpenServerRedPacketInfo()
|
packData.Clear()
|
packData.MoneyNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSRedPacketGrabMoney, 0)
|
packData.GrabCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSRedPacketCanGrabCnt, 0)
|
startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSRedPacketStartTime, 0)
|
if not startTime:
|
createRoleTime = curPlayer.GetCreateRoleTime()
|
startTime = GameWorld.ChangeTimeStrToNum(createRoleTime)
|
packData.StartTime = startTime
|
|
NetPackCommon.SendFakePack(curPlayer, packData)
|
return
|
|
|
#// AB 12 ÇÀºì°ü #tagCMGrabFamilyRedPacket
|
#
|
#struct tagCMGrabFamilyRedPacket
|
#{
|
# tagHead Head;
|
# DWORD RedPaketID; // ºì°üID
|
# BYTE GetWay; //»ñµÃ;¾¶
|
#};
|
def OnGrabFamilyRedPacket(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
redPacketID = clientData.RedPaketID
|
reqGetWay = clientData.GetWay
|
if reqGetWay == ShareDefine.RedPackType_OpenServer:
|
canGrabCnt = GetOSCanGrabCnt(curPlayer)
|
elif reqGetWay == ShareDefine.RedPackType_FeastSucc:
|
canGrabCnt = PlayerFeastRedPacket.GetFeastSuccRedPacketCanGrabCnt(curPlayer)
|
elif reqGetWay == ShareDefine.RedPackType_Server:
|
canGrabCnt = GetServerRedPackCanGrabCnt(curPlayer)
|
else:
|
canGrabCnt = -1
|
msg = str([redPacketID, reqGetWay, canGrabCnt])
|
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "GrabFamilyRedPacket", msg, len(msg))
|
GameWorld.DebugLog(' ÇÀºì°ü redPacketID=%s,getWay=%s,canGrabCnt=%s' % (redPacketID, reqGetWay, canGrabCnt))
|
return
|
|
|
def GetOSCanGrabCnt(curPlayer):
|
#»ñÈ¡¿ª·þºì°ü¿ÉÇÀ´ÎÊý
|
# oscDay = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg')
|
# openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)
|
# if openServerDay >= oscDay:
|
# return 0
|
#curGrabCnt =
|
return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSRedPacketCanGrabCnt, 0)
|
# createRoleTime = curPlayer.GetCreateRoleTime()
|
# createRoleTimeNum = GameWorld.ChangeTimeStrToNum(createRoleTime)
|
# curTime = int(time.time())
|
# rangeTime = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg', 3)
|
# initCnt = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg', 2)
|
# return (curTime - createRoleTimeNum)/rangeTime + initCnt - curGrabCnt
|
|
def GrabOSRedPacketResult(curPlayer, moneyNum, isSelf):
|
##ÇÀ¿ª·þºì°ü½á¹û
|
grabNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSRedPacketGrabMoney, 0)
|
newGrabNum = grabNum+moneyNum
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSRedPacketGrabMoney, newGrabNum)
|
#¹ã²¥
|
needSysOSRAllMoneyList = IpyGameDataPY.GetFuncEvalCfg('OSRAllMoneySys')
|
lastIndex = -1
|
newIndex = -1
|
for i, num in enumerate(needSysOSRAllMoneyList):
|
if grabNum >= num:
|
lastIndex = i
|
if newGrabNum >= num:
|
newIndex = i
|
if newIndex != -1 and newIndex > lastIndex:
|
PlayerControl.WorldNotify(0, 'OpenRedBag1', [curPlayer.GetName(), newGrabNum])
|
|
if not isSelf: #ÇÀ×Ô¼ºµÄºì°ü²»¿Û´ÎÊý
|
grabCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSRedPacketCanGrabCnt, 0)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSRedPacketCanGrabCnt, max(0, grabCnt-1))
|
# if grabCnt == IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg', 4):
|
# PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSRedPacketStartTime, int(time.time()))
|
|
|
#֪ͨ
|
NotifyOSRedPacket(curPlayer)
|
return
|
|
def GetServerRedPackCanGrabCnt(curPlayer):
|
#»ñȡȫ·þºì°ü¿ÉÇÀ´ÎÊý
|
# @return: -1Ϊ²»ÏÞ
|
vipLVMaxGrabCntDict = IpyGameDataPY.GetFuncEvalCfg("RechargeRedPacket", 3, {})
|
vipLVList = [int(vipStr) for vipStr in vipLVMaxGrabCntDict.keys()]
|
vipLVList.sort()
|
for vipLV in vipLVList:
|
if curPlayer.GetVIPLv() <= vipLV:
|
maxGrabCnt = vipLVMaxGrabCntDict[str(vipLV)]
|
if not maxGrabCnt:
|
return -1
|
todayGrabCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ServerRedPacketGrabCnt)
|
return max(0, maxGrabCnt - todayGrabCnt)
|
return 0
|
|
def GrabServerRedPacketResult(curPlayer, moneyNum, isSelf):
|
##ÇÀÈ«·þºì°ü½á¹û
|
|
if isSelf:
|
return
|
|
grabCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ServerRedPacketGrabCnt)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ServerRedPacketGrabCnt, grabCnt + 1)
|
|
__NotifyGoldLimt(curPlayer)
|
return
|
|
def ProcessOSRedPacket(curPlayer, tick):
|
return
|
#¿ª·þºì°ü»Ö¸´´ÎÊý
|
if not GameWorld.SetPlayerTickTime(curPlayer, ChConfig.TYPE_Player_Tick_OSRedPacket, tick):
|
return
|
oscDay = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg')
|
openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)
|
if openServerDay >= oscDay:
|
return
|
grabCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSRedPacketCanGrabCnt, 0)
|
limitCnt = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg', 4)
|
if grabCnt >= limitCnt:
|
return
|
startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSRedPacketStartTime, 0)
|
if not startTime:
|
newCnt = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg', 2)
|
createRoleTime = curPlayer.GetCreateRoleTime()
|
curTime = GameWorld.ChangeTimeStrToNum(createRoleTime)
|
else:
|
curTime = int(time.time())
|
passTime = curTime - startTime
|
rangeTime = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg', 3)
|
addCnt = passTime / rangeTime
|
if addCnt <= 0:#·ÀÖ¹²âÊÔµ÷ʱ¼äµ¼ÖÂÒì³£
|
return
|
newCnt = min(limitCnt, grabCnt+addCnt)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSRedPacketCanGrabCnt, newCnt)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSRedPacketStartTime, curTime)
|
NotifyOSRedPacket(curPlayer)
|
return
|