#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package Player.PlayerPrestigeSys
|
#
|
# @todo:¾ôλϵͳ/ÉÙÄê¾³½ç
|
# @author hxp
|
# @date 2017-7-21
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ¾ôλϵͳ/ÉÙÄê¾³½ç
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2017-10-10 14:30"""
|
#-------------------------------------------------------------------------------
|
|
import ItemCommon
|
import GameFuncComm
|
import PlayerControl
|
import ChPyNetSendPack
|
import NetPackCommon
|
import IPY_GameWorld
|
import IpyGameDataPY
|
import ShareDefine
|
import GameWorld
|
import ChConfig
|
import PlayerMagicWeapon
|
import PlayerSuccess
|
import OpenServerCampaign
|
import PlayerBillboard
|
import EventShell
|
import DataRecordPack
|
|
#------------------------------------------------------------------------------
|
(
|
StopSitType1, #ÀëÏßÖжÏ
|
StopSitType2, #Ö÷¶¯ÖжÏ
|
StopSitType3, #±»²É¼¯´ò¶Ï
|
)=range(1,4)
|
|
|
def DoOfficialOpen(curPlayer):
|
#¹¦ÄÜ¿ªÆô
|
# curRealmLV = curPlayer.GetOfficialRank()
|
# if not curRealmLV:
|
# DoRealmLVUpLogic(curPlayer)
|
return True
|
|
def OnLogin(curPlayer):
|
|
SyncRealmFBState(curPlayer)
|
return
|
|
def GetRealmIpyData(realmLV): return IpyGameDataPY.GetIpyGameData("Realm", realmLV)
|
|
#// A5 24 ¿ªÆô¶É½Ù #tagCMOpenRealmFB
|
#
|
#struct tagCMOpenRealmFB
|
#{
|
# tagHead Head;
|
#};
|
def OpenRealmFB(index, clientData, tick):
|
return
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Official):
|
GameWorld.DebugLog("¾ôλ¾³½ç¹¦ÄÜ먦Æô, ÎÞ·¨¿ªÆô¶É½Ù!curLV=%s" % curPlayer.GetLV())
|
return
|
|
if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmFBIsOpen):
|
GameWorld.DebugLog("¶É½ÙÒÑ¿ªÆô£¬ÎÞ·¨ÔٴοªÆô£¡")
|
return
|
|
curRealmLV = curPlayer.GetOfficialRank()
|
realmIpyData = GetRealmIpyData(curRealmLV)
|
if not realmIpyData:
|
GameWorld.ErrLog("ûÓиþ³½çµÈ¼¶Êý¾Ý! Lv=%s" % curRealmLV)
|
return
|
needRealmPoint = realmIpyData.GetNeedPoint()
|
if not needRealmPoint:
|
GameWorld.DebugLog("¾³½çÒÑÊÇ×î´óµÈ¼¶£¬²»ÄÜÉý¼¶! Lv=%s" % curRealmLV, curPlayer.GetPlayerID())
|
return
|
if not PlayerControl.HaveMoney(curPlayer, ShareDefine.TYPE_Price_RealmPoint, needRealmPoint, False):
|
GameWorld.DebugLog("¾³½çÐÞÁ¶µã²»×㣬ÎÞ·¨¿ªÆô¶É½Ù£¡needRealmPoint=%s" % (needRealmPoint), curPlayer.GetPlayerID())
|
return
|
needActiveTreasureDict = realmIpyData.GetNeedActiveTreasure()
|
for mwType, needActiveCnt in needActiveTreasureDict.items():
|
activeCnt = PlayerMagicWeapon.GetMWActiveCntByType(curPlayer, mwType)
|
if activeCnt < needActiveCnt:
|
GameWorld.DebugLog("¿ªÆô¶É½Ù ÐèÒª·¨±¦µÄ¼¤»îÌõ¼þ²»Âú×ã! needActiveTreasureDict=%s,·¨±¦ÀàÐÍ=%s, ÒѼ¤»îÊýÁ¿=%s" % (needActiveTreasureDict, mwType, activeCnt))
|
return
|
|
|
needItemID = realmIpyData.GetNeedItemID()
|
needItemCount = realmIpyData.GetNeedItemCnt()
|
# Ö§³Ö²»ÏûºÄÎïÆ·Éý¼¶
|
if needItemID > 0 and needItemCount > 0:
|
curPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
hasEnough, itemIndexList = ItemCommon.GetItem_FromPack_ByID(needItemID, curPack, needItemCount)
|
if not hasEnough:
|
GameWorld.DebugLog("¶É½Ù¿ªÆô, ²ÄÁϲ»×ã! Lv=%s, needItemID=%s,needItemCount=%s"
|
% (curRealmLV, needItemID, needItemCount))
|
return
|
#¿Û³ýÎïÆ·
|
ItemCommon.ReduceItem(curPlayer, curPack, itemIndexList, needItemCount, True, "Realm")
|
PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_RealmPoint, needRealmPoint)
|
|
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmFBIsOpen, 1)
|
SyncRealmFBState(curPlayer)
|
GameWorld.Log("¿ªÆô¶É½Ù¸±±¾³É¹¦: curRealmLV=%s" % curRealmLV, curPlayer.GetPlayerID())
|
return
|
|
def SyncRealmFBState(curPlayer):
|
#֪ͨ¿Í»§¶Ë¶É½Ù¸±±¾ÊÇ·ñ¿ªÆô
|
return
|
if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Official):
|
return
|
sendPack = ChPyNetSendPack.tagMCSyncRealmFBIsOpen()
|
sendPack.IsOpen = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmFBIsOpen)
|
sendPack.SitAllTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmSitAllTime)
|
sendPack.SitRemainTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmSitRemainTime)
|
sendPack.SitStartTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmSitStartTime)
|
#sendPack.LastEnterTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmFBLastEnterTime)
|
NetPackCommon.SendFakePack(curPlayer, sendPack)
|
return
|
|
## ¼ÆËã¾ôλÊôÐÔ
|
# @param curPlayer Íæ¼Ò
|
# @param allAttrList ÊôÐÔÁбí
|
# @return None
|
def CalcOfficialRankAttr(curPlayer):
|
if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Official):
|
return
|
|
curRealmLV = curPlayer.GetOfficialRank()
|
realmIpyData = GetRealmIpyData(curRealmLV)
|
if not realmIpyData:
|
return
|
|
addAttrIDList, addAttrValueList = realmIpyData.GetAddAttrType(), realmIpyData.GetAddAttrNum()
|
|
allAttrList = [{} for i in range(4)]
|
for i, attrID in enumerate(addAttrIDList):
|
PlayerControl.CalcAttrDict_Type(attrID, addAttrValueList[i], allAttrList)
|
|
# ±£´æ¼ÆËãÖµ
|
PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Prestige, allAttrList)
|
return
|
|
|
## ÖØË¢ËùÓÐÊôÐÔ
|
# @param curPlayer
|
# @param isForceRefresh:Ç¿ÖÆË¢ÐÂÅÅÐаñ
|
# @return Ö¸¶¨Êý¾Ý
|
def RefreshOfficialAttr(curPlayer):
|
CalcOfficialRankAttr(curPlayer)
|
PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
|
return
|
|
#// A5 23 ÌáÉý¾³½çµÈ¼¶ # tagCMRealmLVUp
|
#
|
#struct tagCMRealmLVUp
|
#{
|
# tagHead Head;
|
#};
|
def DoRealmLVUp(index, clientData, tick):
|
#Éý¼¶¾³½ç
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
canLvUp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmFBIsOpen) == 2
|
if not canLvUp:
|
GameWorld.DebugLog(' ²»ÄÜÉý¼¶¾³½ç')
|
return
|
|
DoRealmLVUpLogic(curPlayer)
|
return
|
|
def DoRealmLVUpLogic(curPlayer):
|
curRealmLV = curPlayer.GetOfficialRank()
|
nextRealmLv = curRealmLV + 1
|
GameWorld.DebugLog(' Éý¼¶¾³½çnextRealmLv=%s'%nextRealmLv)
|
nextRealmIpyData = GetRealmIpyData(nextRealmLv)
|
if not nextRealmIpyData:
|
return
|
|
curPlayer.SetOfficialRank(nextRealmLv)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmFBIsOpen, 0)
|
PlayerControl.WorldNotify(0, 'RealmUpSuccess', [curPlayer.GetName(), nextRealmLv])
|
RefreshOfficialAttr(curPlayer)
|
GameFuncComm.DoFuncOpenLogic(curPlayer)
|
SyncRealmFBState(curPlayer)
|
#¾³½çÌáÉý³É¾Í
|
PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_RealmlvUp, nextRealmLv)
|
#¸üÐÂÅÅÐаñ
|
PlayerBillboard.UpdateRealmBillboard(curPlayer)
|
# ¼Ç¼¿ª·þ»î¶¯
|
OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_RealmLV, nextRealmLv)
|
EventShell.EventRespons_RealmUp(curPlayer, nextRealmLv)
|
#Á÷Ïò
|
realmPoint = PlayerControl.GetMoney(curPlayer, ShareDefine.TYPE_Price_RealmPoint)
|
realmIpyData = GetRealmIpyData(curRealmLV)
|
needRealmPoint = realmIpyData.GetNeedPoint() if realmIpyData else 0
|
DataRecordPack.DR_RealmLVUp(curPlayer, nextRealmLv, realmPoint, needRealmPoint)
|
return True
|
|
def DologicDujieFBPass(curPlayer, realmLV, star):
|
#¶É½Ùͨ¹ýºó´¦Àí
|
realmIpyData = GetRealmIpyData(realmLV)
|
if not realmIpyData:
|
return
|
needRealmPoint = realmIpyData.GetNeedPoint()
|
PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_RealmPoint, needRealmPoint)
|
DoRealmLVUpLogic(curPlayer)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmFBIsOpen, 0)
|
|
# sitTimeDict = realmIpyData.GetSitTime()
|
# sitSecond = sitTimeDict.get(str(star), 0)
|
# if sitSecond == 0:
|
# #ûÓдò×øÊ±¼ä£¬Ö±½ÓÉý¾³½ç
|
# PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmFBIsOpen, 2)
|
# else:
|
# PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmSitAllTime, sitSecond)
|
# PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmSitRemainTime, sitSecond)
|
# SyncRealmFBState(curPlayer)
|
|
|
return
|
|
|
|
#// A5 0C ʹÓõÀ¾ß¼õÉٶɽٴò×øÊ±¼ä #tagCMReduceSitTime
|
#
|
#struct tagCMReduceSitTime
|
#{
|
# tagHead Head;
|
# WORD ItemCnt; // µÀ¾ßÊýÁ¿
|
#};
|
def OnReduceSitTime(index, clientData, tick):
|
# curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
# itemCnt = clientData.ItemCnt
|
# reduceSitTimeItemID = IpyGameDataPY.GetFuncCfg('ReduceSitTimeItemID')
|
#
|
# remainTime = __GetRemainSitTime(curPlayer)
|
# if remainTime <= 0:
|
# GameWorld.DebugLog('ʹÓõÀ¾ß¼õÉٶɽٴò×øÊ±¼ä remainTime=%s' % remainTime)
|
# return
|
# curItem = GameWorld.GetGameData().GetItemByTypeID(reduceSitTimeItemID)
|
# curEff = curItem.GetEffectByIndex(0)
|
# singleReduceTime = curEff.GetEffectValue(0)
|
# useCnt = min(itemCnt, remainTime/singleReduceTime)
|
# if not useCnt:
|
# GameWorld.DebugLog('ʹÓõÀ¾ß¼õÉٶɽٴò×øÊ±¼ä useCnt=%s' % useCnt)
|
# return
|
#
|
# itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
# hasEnough, itemList = ItemCommon.GetItem_FromPack_ByID(reduceSitTimeItemID, itemPack, useCnt)
|
# if not hasEnough:
|
# GameWorld.DebugLog('ʹÓõÀ¾ß¼õÉٶɽٴò×øÊ±¼ä µÀ¾ß²»×ã%s' % useCnt)
|
# return
|
#
|
# ItemCommon.ReduceItem(curPlayer, itemPack, itemList, useCnt, False)
|
#
|
# reduceTime = useCnt * singleReduceTime
|
# sitRemainTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmSitRemainTime)
|
# newRemainTime = max(0, sitRemainTime-reduceTime)
|
# PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmSitRemainTime, newRemainTime)
|
# GameWorld.DebugLog('ʹÓõÀ¾ß¼õÉٶɽٴò×øÊ±¼ä ʹÓõÀ¾ß%s,¼õÉÙ´ò×øÊ±¼ä%sÃë' % (useCnt, reduceTime))
|
# SyncRealmFBState(curPlayer)
|
return
|