#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package PlayerFamilyZhenbaoge # # @todo:Õ䱦¸ó # @author hxp # @date 2024-10-29 # @version 1.0 # # ÏêϸÃèÊö: Õ䱦¸ó # #------------------------------------------------------------------------------- #"""Version = 2024-10-29 17:30""" #------------------------------------------------------------------------------- import ChConfig import ShareDefine import IpyGameDataPY import PlayerFamily import GameWorld import DBDataMgr import random import time import ChPyNetSendPack import NetPackCommon import ItemControler import PlayerControl ActionType = ShareDefine.Def_ActionType_Zhenbaoge ActionGlobalID = 1 # È«¾Ö¼Ç¼ID # È«¾Ö¼Ç¼ #Time ±¾ÂÖ¿ªÊ¼Ê±¼ä´Á #Value1 ActionGlobalID def GetFAPrice(gActionData): return gActionData.GetValue2() def SetFAPrice(gActionData, price): return gActionData.SetValue2(price) def GetFAIsNegative(gActionData): return gActionData.GetValue3() # ÊÇ·ñ¸ºÖµ def SetFAIsNegative(gActionData, isNegative): return gActionData.SetValue3(isNegative) def GetFAPriceFinal(gActionData): ## »ñÈ¡×îÖÕ¼Û¸ñ price = GetFAPrice(gActionData) isNegative = GetFAIsNegative(gActionData) return price if not isNegative else -price def SetFAPriceFinal(gActionData, totalPrice): SetFAPrice(gActionData, abs(totalPrice)) SetFAIsNegative(gActionData, 1 if totalPrice < 0 else 0) return def GetFAItemList(gActionData): return eval(gActionData.GetUseData()) # ÎïÆ·Áбí def SetFAItemList(gActionData, itemList): dataStr = str(itemList) gActionData.SetUseData(dataStr, len(dataStr)) return # ³ÉÔ±¿³¼Û¼Ç¼ #Time ¿³¼Ûʱ¼ä´Á #Name Íæ¼ÒÃû def GetFAPlayerID(actionData): return actionData.GetValue1() def SetFAPlayerID(actionData, playerID): return actionData.SetValue1(playerID) def GetFACutPrice(actionData): return actionData.GetValue2() # Íæ¼Ò¿³Á˶àÉÙ def SetFACutPrice(actionData, cutPrice): return actionData.SetValue2(cutPrice) def GetFABuyState(actionData): return actionData.GetValue3() # Íæ¼ÒÊÇ·ñÒѹºÂò def SetFABuyState(actionData, buyState): return actionData.SetValue3(buyState) def OnDayEx(family): OnZhenbaogeReset(family) return def OnZhenbaogeReset(family): ## Õ䱦¸óÖØÖà familyID = family.GetID() familyAction = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, ActionType) gActionData = familyAction.AddAction() SetFAPlayerID(gActionData, ActionGlobalID) initPrice = IpyGameDataPY.GetFuncCfg("Zhenbaoge", 2) randItemList = [] ipyDataMgr = IpyGameDataPY.IPY_Data() for index in range(ipyDataMgr.GetFamilyZhenbaogeItemCount()): ipyData = ipyDataMgr.GetFamilyZhenbaogeItemByIndex(index) randItemList.append([ipyData.GetItemWeight(), ipyData.GetItemList()]) itemList = GameWorld.GetResultByWeightList(randItemList, []) SetFAPriceFinal(gActionData, initPrice) SetFAItemList(gActionData, itemList) #PlayerFamilyAction.SendFamilyAction(gActionData) GameWorld.DebugLog("Õ䱦¸óÖØÖÃ! familyID=%s,itemList=%s" % (familyID, itemList), familyID) return def GetZhenbaogeActionData(familyID, playerID): ## »ñÈ¡Action findActionData = None familyAction = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, ActionType) for index in range(0, familyAction.Count()): actionData = familyAction.At(index) if GetFAPlayerID(actionData) == playerID: findActionData = actionData break return findActionData def MapServer_ZhenbaogeOP(curPlayer, msgList): mapID = curPlayer.GetRealMapID() playerID = curPlayer.GetPlayerID() GameWorld.DebugLog("MapServer_ZhenbaogeOP mapID=%s,msgList=%s" % (mapID, msgList), playerID) if not msgList: return curFamily = curPlayer.GetFamily() if not curFamily: return familyID = curFamily.GetID() gActionData = GetZhenbaogeActionData(familyID, ActionGlobalID) if not gActionData: GameWorld.DebugLog("Õ䱦¸ó»¹Ã»ÓÐË¢ÐÂ! familyID=%s" % familyID, playerID) return msgType, dataMsg = msgList ret = None if msgType == "Cut": cutPrice = CalcCutPrice(curFamily, gActionData, playerID) if cutPrice: AddCutPrice(familyID, playerID, curPlayer.GetName(), cutPrice, gActionData) ret = [cutPrice] elif msgType == "Buy": buyRet = __DoZhenbaogeBuy(familyID, playerID, gActionData, dataMsg) if buyRet: ret = [True] + list(buyRet) else: ret = [False] if ret == None: return return msgList + (ret if isinstance(ret, list) else [ret]) def CalcCutPrice(curFamily, gActionData, playerID): ## ¼ÆË㿳¼Û¼Û¸ñ # @return: None-¿³¼ÛÏÞÖÆµÈ£»>0-¿³¼ÛÖµ familyID = curFamily.GetID() familyAction = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, ActionType) actionCount = familyAction.Count() # ÆäÖÐ1ÌõÊǹ«¹²Êý¾Ý hadCutCount = actionCount - 1 maxMemberCnt = PlayerFamily.GetFamilySetting(curFamily, ChConfig.Def_FamilySetting_MaxMemberCnt) if hadCutCount >= maxMemberCnt: GameWorld.ErrLog("ÒÑ´ïµ½ÏÉÃË¿³¼ÛÈË´ÎÉÏÏÞ! hadCutCount=%s >= %s,familyID=%s,familyLV=%s" % (hadCutCount, maxMemberCnt, familyID, curFamily.GetLV()), playerID) return actionData = GetZhenbaogeActionData(familyID, playerID) if actionData and GetFACutPrice(actionData): GameWorld.DebugLog("ÒѾ­ÔÚ¸ÃÃËÕ䱦¸ó¿³¼Û¹ýÁË! familyID=%s" % familyID, playerID) return cutNum = hadCutCount + 1 cutIpyData = IpyGameDataPY.GetIpyGameData("FamilyZhenbaogeCut", cutNum) if not cutIpyData: return cutWeight = cutIpyData.GetCutWeight() minRatio = cutIpyData.GetMinRatio() randRatio = cutIpyData.GetRandRatio() totalWeight = PlayerFamily.GetFamilySetting(curFamily, ChConfig.Def_FamilySetting_ZhenbaogeWeights) rand = random.random() #Ëæ»úÖµ 0~1 initPrice = IpyGameDataPY.GetFuncCfg("Zhenbaoge", 2) cutPrice = max(1, eval(IpyGameDataPY.GetFuncCompileCfg("ZhenbaogeCut", 2))) nowPrice = GetFAPriceFinal(gActionData) updPrice = nowPrice - cutPrice lowestPrice = IpyGameDataPY.GetFuncCfg("ZhenbaogeCut", 1) # ×îµÍ¼Û¸ñ±£»¤ if updPrice < lowestPrice: if nowPrice > lowestPrice: updPrice = int(lowestPrice - random.randint(0, 2)) # ֮ǰ»¹Î´µ½´ï×îµÍ¼Û£¬¹Ì¶¨×îµÍ¼Û+Ëæ»ú0~2 cutPrice = nowPrice - updPrice else: cutPrice = random.randint(1, 2) # µÍÓÚ×îµÍ¼Û¸ñºó¿³¼ÛÖ»ÄÜËæ»ú1»ò2 updPrice = nowPrice - cutPrice GameWorld.DebugLog("Õ䱦¸ó¿³¼Û¼ÆËãµØ°å¼Û±£»¤: cutPrice=%s,nowPrice=%s,updPrice=%s" % (cutPrice, nowPrice, updPrice), playerID) else: GameWorld.DebugLog("Õ䱦¸ó¿³¼Û¼ÆËã: cutPrice=%s,nowPrice=%s,updPrice=%s,cutWeight=%s/%s,minRatio=%s,randRatio=%s,rand=%s,initPrice=%s" % (cutPrice, nowPrice, updPrice, cutWeight, totalWeight, minRatio, randRatio, rand, initPrice), playerID) return max(1, cutPrice) def AddCutPrice(familyID, playerID, playerName, cutPrice, gActionData, isNotify=True): ## Ìí¼Ó¿³¼Û¼Ç¼ familyAction = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, ActionType) actionData = familyAction.AddAction() actionData.SetFamilyId(familyID) actionData.SetActionType(ActionType) actionData.SetTime(int(time.time())) actionData.SetName(playerName) SetFAPlayerID(actionData, playerID) SetFACutPrice(actionData, cutPrice) # ¸üÐÂ×îÖÕ¼Û¸ñ nowPrice = GetFAPriceFinal(gActionData) updPrice = nowPrice - cutPrice SetFAPriceFinal(gActionData, updPrice) GameWorld.DebugLog("Õ䱦¸ó¿³¼Û¸üÐÂ: playerID=%s,cutPrice=%s,nowPrice=%s,updPrice=%s,familyID=%s" % (playerID, cutPrice, nowPrice, updPrice, familyID), playerID) if isNotify: pass #PlayerFamilyAction.SendFamilyAction([gActionData, actionData]) return actionData def __DoZhenbaogeBuy(familyID, playerID, gActionData, dataMsg): playerMoneyValue = dataMsg[0] actionData = GetZhenbaogeActionData(familyID, playerID) if not actionData: GameWorld.DebugLog("Õ䱦¸óδ¿³¼Û£¬ÎÞ·¨¹ºÂò! familyID=%s" % familyID, playerID) return if GetFABuyState(actionData): GameWorld.DebugLog("Õ䱦¸óÒѾ­¹ºÂò¹ýÁË! familyID=%s" % familyID, playerID) return nowPrice = GetFAPriceFinal(gActionData) if nowPrice > 0 and playerMoneyValue < nowPrice: GameWorld.DebugLog("Íæ¼Òµ±Ç°»õ±Ò²»×㣬ÎÞ·¨¹ºÂòÕ䱦¸óÎïÆ·! playerMoneyValue=%s < %s" % (playerMoneyValue, nowPrice), playerID) return giveItemList = GetFAItemList(gActionData) GameWorld.DebugLog("Õ䱦¸ó¹ºÂò! familyID=%s,nowPrice=%s,giveItemList=%s" % (familyID, nowPrice, giveItemList), playerID) # ÉèÖÃÒÑÂò SetFABuyState(actionData, 1) #PlayerFamilyAction.SendFamilyAction(actionData) return nowPrice, giveItemList ##----------------------------------------- Õ䱦¸ó -------------------------------------------------- #// A6 16 Õ䱦¸ó²Ù×÷ #tagCMZhenbaogeOP # #struct tagCMZhenbaogeOP #{ # tagHead Head; # BYTE OpType; // ²Ù×÷£º0-¿³¼Û£»1-¹ºÂò #}; def OnZhenbaogeOP(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) opType = clientData.OpType playerID = curPlayer.GetPlayerID() if not curPlayer.GetFamilyID(): GameWorld.DebugLog("ûÓÐÏÉÃËÎÞ·¨²Ù×÷Õ䱦¸ó!", playerID) return # ¿³¼Û if opType == 0: leaveTimeEx = PlayerControl.GetLeaveFamilyTimeEx(curPlayer) cutState = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyZhenbaogeCut) if cutState and leaveTimeEx: cutCDTimes = IpyGameDataPY.GetFuncCfg("Zhenbaoge", 3) * 60 passTimes = int(time.time()) - leaveTimeEx if passTimes < cutCDTimes: GameWorld.DebugLog("½ñÈÕÒÑ¿³¼Û±ä¸üÏÉÃË¿³¼ÛCDÖÐ! passTimes=%s < %s" % (passTimes, cutCDTimes), playerID) return SendGameServer_FamilyZhenbaoge(curPlayer, "Cut", []) # ¹ºÂò elif opType == 1: buyState = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyZhenbaogeBuy) if buyState: GameWorld.DebugLog("Õ䱦¸ó½ñÈÕÒѹºÂò!", playerID) return moneyType = IpyGameDataPY.GetFuncCfg("Zhenbaoge", 1) playerMoneyValue = PlayerControl.GetMoney(curPlayer, moneyType) SendGameServer_FamilyZhenbaoge(curPlayer, "Buy", [playerMoneyValue]) return def SendGameServer_FamilyZhenbaoge(curPlayer, msgType, msgData): playerID = curPlayer.GetPlayerID() tick = GameWorld.GetGameWorld().GetTick() if not GameWorld.SetPlayerTickTime(curPlayer, ChConfig.TYPE_Player_Tick_FamilyZhenbaoge, tick): GameWorld.DebugLog("ÇëÇóCDÖÐ...", playerID) return GameWorld.DebugLog("Õ䱦¸óͬ²½GameServer: msgType=%s,%s" % (msgType, msgData), playerID) msgInfo = str([msgType, msgData]) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "FamilyZhenbaoge", msgInfo, len(msgInfo)) return def GameServer_FamilyZhenbaogeRet(curPlayer, resultList): curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_FamilyZhenbaoge, 0) playerID = curPlayer.GetPlayerID() msgType, _ = resultList[:2] retData = resultList[2:] GameWorld.Log("ÏÉÃËÕ䱦¸óGameServer·µ»Ø: %s" % str(resultList), playerID) if msgType == "Cut": cutPrice = retData[0] if not cutPrice: # ¿³¼Ûʧ°Ü²»´¦ÀíºóÐø return PlayerControl.NotifyCode(curPlayer, "ZhenbaogeCut", [cutPrice]) if not curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyZhenbaogeCut): PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyZhenbaogeCut, 1) Sync_ZhenbaogeInfo(curPlayer) elif msgType == "Buy": isOK = retData[0] if not isOK: return buyState = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyZhenbaogeBuy) if buyState: #Ò»ÌìÖ»ÄÜÂòÒ»´Î£¬·ÀÖ¹±ä¸üÏÉÃËË¢ return nowPrice, giveItemList = retData[1:] moneyType = IpyGameDataPY.GetFuncCfg("Zhenbaoge", 1) if nowPrice > 0: if not PlayerControl.PayMoney(curPlayer, moneyType, nowPrice, "Zhenbaoge"): GameWorld.ErrLog("Õ䱦¸ó¹ºÂò»õ±Ò²»×ã! nowPrice=%s" % nowPrice, playerID) return elif nowPrice < 0: PlayerControl.GiveMoney(curPlayer, moneyType, -nowPrice, "Zhenbaoge") else: # 0²»´¦Àí pass if giveItemList: ItemControler.GivePlayerItemOrMail(curPlayer, giveItemList, event=["Zhenbaoge", False, {}], isNotifyAward=False) ItemControler.NotifyGiveAwardInfo(curPlayer, giveItemList, "Zhenbaoge", moneyInfo={moneyType:0 if nowPrice > 0 else -nowPrice}) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyZhenbaogeBuy, 1) Sync_ZhenbaogeInfo(curPlayer) return def Sync_ZhenbaogeInfo(curPlayer): clientPack = ChPyNetSendPack.tagMCFamilyZhenbaogeInfo() clientPack.CutState = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyZhenbaogeCut) clientPack.BuyState = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyZhenbaogeBuy) NetPackCommon.SendFakePack(curPlayer, clientPack) return ##--------------------------------------------------------------------------------------------------