From e1fb8828f3e3ade575522e1717322a27e0521daf Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 10 十一月 2025 20:09:16 +0800
Subject: [PATCH] 247 【付费内容】特权卡-服务端
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py | 244 ++------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GoldInvest.py | 56 +++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py | 7
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldInvest.py | 427 ++++++++-----------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py | 7
/dev/null | 36 --
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini | 18
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DataRecordPack.py | 13
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 31 -
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py | 21 +
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py | 2
PySysDB/PySysDBPY.h | 12
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py | 10
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py | 2
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 24 -
15 files changed, 290 insertions(+), 620 deletions(-)
diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 0507b3a..76208c7 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -1479,18 +1479,6 @@
list VIPAward; //vip奖励[[物品ID,个数],...]
};
-//投资表
-
-struct tagInvest
-{
- WORD _ID; //ID
- BYTE Type; //投资类型
- BYTE NeedDay; //需要天数
- WORD NeedLV; //需要等级
- DWORD NeedNPCID; //需要NPCID
- dict Reward; //奖励 {"key":[[物品ID,个数,是否绑定],...], ...}
-};
-
//仙宝寻主表
struct tagXBXZ
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
index bc92a20..28d12b5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -314,18 +314,6 @@
PacketSubCMD_3=0x24
PacketCallFunc_3=MoveTouchNPC
-;VIP功能
-[PlayerVip]
-ScriptName = Player\PlayerVip.py
-Writer = alee
-Releaser = alee
-RegType = 0
-RegisterPackCount = 1
-
-PacketCMD_1=0xA8
-PacketSubCMD_1=0x06
-PacketCallFunc_1=OnQueryRecharge
-
;玩家副本
[PlayerFB]
ScriptName = Player\PlayerFB.py
@@ -922,7 +910,7 @@
Writer = hxp
Releaser = hxp
RegType = 0
-RegisterPackCount = 3
+RegisterPackCount = 4
PacketCMD_1=0xA1
PacketSubCMD_1=0x23
@@ -936,6 +924,10 @@
PacketSubCMD_3=0x26
PacketCallFunc_3=OnSelectCTGItem
+PacketCMD_4=0xA8
+PacketSubCMD_4=0x06
+PacketCallFunc_4=OnQueryRecharge
+
;限时抢购
[PlayerFlashSale]
ScriptName = Player\PlayerFlashSale.py
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index ee41b3f..a6ca73e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3670,11 +3670,9 @@
Def_PDict_LastEnterFBTick = "LastEnterFBTick_%s" # 上次进入副本的时间%s副本id
# 投资理财
-Def_PDict_InvestTime = "InvestTime_%s" # 投资时的时间,参数为投资类型
-Def_PDict_InvestProgress = "InvestProgress_%s_%s" # 投资可领奖进度值,参数为(投资类型, key编号)
-Def_PDict_InvestReward = "InvestReward_%s_%s" # 投资领奖记录,参数为(投资类型, key编号)
-Def_PDict_InvestRewardTime = "InvestRewardTime_%s" # 投资最后一次领奖时间,参数为(投资类型)
-Def_PDict_InvestKeyCount = 3 # key编号数
+Def_PDict_InvestTime = "InvestTime_%s" # 投资时的时间,参数(投资类型)
+Def_PDict_InvestEndTime = "InvestEndTime_%s" # 投资到期时间,参数(投资类型)
+Def_PDict_InvestRewardTime = "InvestRewardTime_%s" # 投资最后一次领奖时间,参数(投资类型)
# 成就 Def_PDictType_Success
Def_PDict_SuccessValue = "Succ_%s_%s" # 当前次数值,参数(成就类型、条件)
@@ -4168,7 +4166,7 @@
Def_Cost_UseSpeaker, # 喇叭发言
Def_Cost_Revive, # 复活
Def_Cost_5, # 副本鼓舞 5
-Def_Cost_GoldInvest, # 理财投资
+Def_Cost_6, # 理财投资
Def_Cost_Pray, # 祈祷
Def_Cost_8, # 资源找回
Def_Cost_BuyVIPItem, # 购买VIP礼包
@@ -4253,7 +4251,6 @@
# 有分消费对象子类的
Def_Cost_BuyVIPItem:"BuyVIPItem",
-Def_Cost_GoldInvest:"GoldInvest",
Def_Cost_Pray:"Pray",
Def_Cost_Treasure:"Treasure",
Def_Cost_OpenNoble:"OpenNoble",
@@ -4328,7 +4325,7 @@
Def_GiveMoney_UseItem, # 使用物品
Def_GiveMoney_Pickup, # 拾取
Def_GiveMoney_Bourse, # 交易所 10
-Def_GiveMoney_GoldInvest, # 绑钻投资
+Def_GiveMoney_11, # 绑钻投资
Def_GiveMoney_12, # 资源找回
Def_GiveMoney_13, # 红包
Def_GiveMoney_RefineGift, # 炼制奖励
@@ -4366,7 +4363,6 @@
Def_GiveMoney_UseItem:"UseItem",
Def_GiveMoney_Pickup:"Pickup",
Def_GiveMoney_Bourse:"Bourse",
-Def_GiveMoney_GoldInvest:"GoldInvest",
Def_GiveMoney_RefineGift:"RefineGift",
Def_GiveMoney_Mail:"Mail",
Def_GiveMoney_RuneDecompose:"RuneDecompose",
@@ -4710,13 +4706,9 @@
# 投资理财类型,和前端对应,从7开始
InvestTypeList = (
-InvestType_NewMonth, # 至尊月卡投资7
-InvestType_Month1, # 新30元月卡投资8
-InvestType_Login, # 登录 9
-InvestType_LV, # 等级 10
-InvestType_Boss, # Boss 11
-InvestType_Life, # 终身卡 12
-) = range(7, 7 + 6)
+InvestType_Month, # 月卡 1
+InvestType_Life, # 终身卡 2
+) = range(1, 1 + 2)
(
tttLeaveMap, # 退出倒计时 0
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 2b16e24..c2c0878 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -5404,135 +5404,6 @@
#------------------------------------------------------
-# A3 37 投资理财信息 #tagMCGoldInvestInfo
-
-class tagMCInvestReward(Structure):
- _pack_ = 1
- _fields_ = [
- ("RewardIndex", c_ushort), # 索引
- ("RewardValue", c_ubyte), # 该等级已领取数据,0可认为未领取
- ]
-
- def __init__(self):
- self.Clear()
- return
-
- def ReadData(self, stringData, _pos=0, _len=0):
- self.Clear()
- memmove(addressof(self), stringData[_pos:], self.GetLength())
- return _pos + self.GetLength()
-
- def Clear(self):
- self.RewardIndex = 0
- self.RewardValue = 0
- return
-
- def GetLength(self):
- return sizeof(tagMCInvestReward)
-
- def GetBuffer(self):
- return string_at(addressof(self), self.GetLength())
-
- def OutputString(self):
- DumpString = '''// A3 37 投资理财信息 //tagMCGoldInvestInfo:
- RewardIndex:%d,
- RewardValue:%d
- '''\
- %(
- self.RewardIndex,
- self.RewardValue
- )
- return DumpString
-
-
-class tagMCGoldInvestInfo(Structure):
- Head = tagHead()
- InvestType = 0 #(BYTE InvestType)// 投资类型
- CurDay = 0 #(DWORD CurDay)// 当前天数
- InvestGold = 0 #(DWORD InvestGold)// 投资额度
- RewardRecordCnt = 0 #(BYTE RewardRecordCnt)// 投资回报个数
- InvestRewardList = list() #(vector<tagMCInvestReward> InvestRewardList)// 投资回报记录
- data = None
-
- def __init__(self):
- self.Clear()
- self.Head.Cmd = 0xA3
- self.Head.SubCmd = 0x37
- return
-
- def ReadData(self, _lpData, _pos=0, _Len=0):
- self.Clear()
- _pos = self.Head.ReadData(_lpData, _pos)
- self.InvestType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- self.CurDay,_pos = CommFunc.ReadDWORD(_lpData, _pos)
- self.InvestGold,_pos = CommFunc.ReadDWORD(_lpData, _pos)
- self.RewardRecordCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- for i in range(self.RewardRecordCnt):
- temInvestRewardList = tagMCInvestReward()
- _pos = temInvestRewardList.ReadData(_lpData, _pos)
- self.InvestRewardList.append(temInvestRewardList)
- return _pos
-
- def Clear(self):
- self.Head = tagHead()
- self.Head.Clear()
- self.Head.Cmd = 0xA3
- self.Head.SubCmd = 0x37
- self.InvestType = 0
- self.CurDay = 0
- self.InvestGold = 0
- self.RewardRecordCnt = 0
- self.InvestRewardList = list()
- return
-
- def GetLength(self):
- length = 0
- length += self.Head.GetLength()
- length += 1
- length += 4
- length += 4
- length += 1
- for i in range(self.RewardRecordCnt):
- length += self.InvestRewardList[i].GetLength()
-
- return length
-
- def GetBuffer(self):
- data = ''
- data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
- data = CommFunc.WriteBYTE(data, self.InvestType)
- data = CommFunc.WriteDWORD(data, self.CurDay)
- data = CommFunc.WriteDWORD(data, self.InvestGold)
- data = CommFunc.WriteBYTE(data, self.RewardRecordCnt)
- for i in range(self.RewardRecordCnt):
- data = CommFunc.WriteString(data, self.InvestRewardList[i].GetLength(), self.InvestRewardList[i].GetBuffer())
- return data
-
- def OutputString(self):
- DumpString = '''
- Head:%s,
- InvestType:%d,
- CurDay:%d,
- InvestGold:%d,
- RewardRecordCnt:%d,
- InvestRewardList:%s
- '''\
- %(
- self.Head.OutputString(),
- self.InvestType,
- self.CurDay,
- self.InvestGold,
- self.RewardRecordCnt,
- "..."
- )
- return DumpString
-
-
-m_NAtagMCGoldInvestInfo=tagMCGoldInvestInfo()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCGoldInvestInfo.Head.Cmd,m_NAtagMCGoldInvestInfo.Head.SubCmd))] = m_NAtagMCGoldInvestInfo
-
-
-#------------------------------------------------------
# A3 C7 古宝信息 #tagMCGubaoInfo
class tagMCGubao(Structure):
@@ -5877,94 +5748,67 @@
#------------------------------------------------------
-# A3 38 投资理财信息 #tagMCInvestInfo
+# A3 38 投资信息 #tagSCInvestInfo
-class tagMCInvestInfo(Structure):
- Head = tagHead()
- InvestType = 0 #(BYTE InvestType)// 投资类型
- CurDay = 0 #(WORD CurDay)// 当前天数,投资第一天为1
- ValueCount = 0 #(BYTE ValueCount)
- RewardValue = list() #(vector<DWORD> RewardValue)//领奖记录值,按投资回报索引位记录是否已领取
- ProgressValue = list() #(vector<DWORD> ProgressValue)//投资相关可领取进度记录值: 9登录投资-记录已登录天数;11Boss投资-按回报索引位记录是否已击杀该boss
- data = None
+class tagSCInvestInfo(Structure):
+ _pack_ = 1
+ _fields_ = [
+ ("Cmd", c_ubyte),
+ ("SubCmd", c_ubyte),
+ ("InvestType", c_ubyte), # 投资类型
+ ("InvestBuyTime", c_int), # 投资购买时间戳,永久的通过该时间判断是否有效或已过天数,任意类型均有该值,过期没有重置,前端自己判断
+ ("InvestEndTime", c_int), # 投资到期时间戳,非永久的通过该时间判断到期时间,有天数限制的才有值
+ ("AwardState", c_ubyte), # 今日是否已领取奖励
+ ]
def __init__(self):
self.Clear()
- self.Head.Cmd = 0xA3
- self.Head.SubCmd = 0x38
+ self.Cmd = 0xA3
+ self.SubCmd = 0x38
return
- def ReadData(self, _lpData, _pos=0, _Len=0):
+ def ReadData(self, stringData, _pos=0, _len=0):
self.Clear()
- _pos = self.Head.ReadData(_lpData, _pos)
- self.InvestType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- self.CurDay,_pos = CommFunc.ReadWORD(_lpData, _pos)
- self.ValueCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- for i in range(self.ValueCount):
- value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
- self.RewardValue.append(value)
- for i in range(self.ValueCount):
- value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
- self.ProgressValue.append(value)
- return _pos
+ memmove(addressof(self), stringData[_pos:], self.GetLength())
+ return _pos + self.GetLength()
def Clear(self):
- self.Head = tagHead()
- self.Head.Clear()
- self.Head.Cmd = 0xA3
- self.Head.SubCmd = 0x38
+ self.Cmd = 0xA3
+ self.SubCmd = 0x38
self.InvestType = 0
- self.CurDay = 0
- self.ValueCount = 0
- self.RewardValue = list()
- self.ProgressValue = list()
+ self.InvestBuyTime = 0
+ self.InvestEndTime = 0
+ self.AwardState = 0
return
def GetLength(self):
- length = 0
- length += self.Head.GetLength()
- length += 1
- length += 2
- length += 1
- length += 4 * self.ValueCount
- length += 4 * self.ValueCount
-
- return length
+ return sizeof(tagSCInvestInfo)
def GetBuffer(self):
- data = ''
- data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
- data = CommFunc.WriteBYTE(data, self.InvestType)
- data = CommFunc.WriteWORD(data, self.CurDay)
- data = CommFunc.WriteBYTE(data, self.ValueCount)
- for i in range(self.ValueCount):
- data = CommFunc.WriteDWORD(data, self.RewardValue[i])
- for i in range(self.ValueCount):
- data = CommFunc.WriteDWORD(data, self.ProgressValue[i])
- return data
+ return string_at(addressof(self), self.GetLength())
def OutputString(self):
- DumpString = '''
- Head:%s,
+ DumpString = '''// A3 38 投资信息 //tagSCInvestInfo:
+ Cmd:%s,
+ SubCmd:%s,
InvestType:%d,
- CurDay:%d,
- ValueCount:%d,
- RewardValue:%s,
- ProgressValue:%s
+ InvestBuyTime:%d,
+ InvestEndTime:%d,
+ AwardState:%d
'''\
%(
- self.Head.OutputString(),
+ self.Cmd,
+ self.SubCmd,
self.InvestType,
- self.CurDay,
- self.ValueCount,
- "...",
- "..."
+ self.InvestBuyTime,
+ self.InvestEndTime,
+ self.AwardState
)
return DumpString
-m_NAtagMCInvestInfo=tagMCInvestInfo()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCInvestInfo.Head.Cmd,m_NAtagMCInvestInfo.Head.SubCmd))] = m_NAtagMCInvestInfo
+m_NAtagSCInvestInfo=tagSCInvestInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSCInvestInfo.Cmd,m_NAtagSCInvestInfo.SubCmd))] = m_NAtagSCInvestInfo
#------------------------------------------------------
@@ -38427,10 +38271,10 @@
("Cmd", c_ubyte),
("SubCmd", c_ubyte),
("ObjID", c_int),
- ("HP", c_int), # 当前血量,求余20亿部分
- ("HPEx", c_int), # 当前血量,整除20亿部分
- ("MaxHP", c_int), # 最大血量,求余20亿部分
- ("MaxHPEx", c_int), # 最大血量,整除20亿部分
+ ("HP", c_int), # 当前血量,求余亿部分
+ ("HPEx", c_int), # 当前血量,整除亿部分
+ ("MaxHP", c_int), # 最大血量,求余亿部分
+ ("MaxHPEx", c_int), # 最大血量,整除亿部分
]
def __init__(self):
@@ -39419,10 +39263,10 @@
("NPCID", c_int), # 战斗NPCID,不同的实例ID对应的NPCID可能一样
("HeroID", c_int), # 武将ID,玩家或NPC均可能有,如果有值则外观相关以该武将为准,否则以NPCID为准
("SkinID", c_int), # 武将皮肤ID,玩家或NPC均可能有,如果有值则皮肤以该值为准,否则取NPCID对应的皮肤ID
- ("HP", c_int), # 当前血量,求余20亿部分
- ("HPEx", c_int), # 当前血量,整除20亿部分
- ("MaxHP", c_int), # 最大血量,求余20亿部分
- ("MaxHPEx", c_int), # 最大血量,整除20亿部分
+ ("HP", c_int), # 当前血量,求余亿部分
+ ("HPEx", c_int), # 当前血量,整除亿部分
+ ("MaxHP", c_int), # 最大血量,求余亿部分
+ ("MaxHPEx", c_int), # 最大血量,整除亿部分
("LV", c_ushort), # 等级,玩家的武将等级或NPC成长等级,等级显示以该值为准
("PosNum", c_ubyte), # 在本阵容中的站位,从1开始,非主战斗武将为0,如红颜
("AngreXP", c_ushort), # 当前怒气值
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DataRecordPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DataRecordPack.py
index 96da147..ef7567f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DataRecordPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DataRecordPack.py
@@ -1172,19 +1172,6 @@
SendEventPack("CollectNPCOK", dataDict, curPlayer)
return
-
-## 领取投资回报
-# @param curPlayer: 玩家实例
-# @return: None
-def DR_GetGoldInvestReward(curPlayer, investType, rewardIndex, itemList):
- dataDict = {'PlayerID':curPlayer.GetPlayerID(), 'PlayerName':curPlayer.GetPlayerName(),
- 'AccID':curPlayer.GetAccID(), 'PlayerLV':curPlayer.GetLV(), 'InvestType':investType,
- 'RewardIndex':rewardIndex,
- 'itemList':itemList}
- #发送封包
- SendEventPack("GetGoldInvestReward", dataDict, curPlayer)
- return
-
## 击杀NPC流向
# @param curPlayer: 玩家实例
# @param eventName:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearInvest.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearInvest.py
deleted file mode 100644
index ee95653..0000000
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearInvest.py
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/usr/bin/python
-# -*- coding: GBK -*-
-#-------------------------------------------------------------------------------
-#
-#-------------------------------------------------------------------------------
-#
-##@package GM.Commands.ClearInvest
-#
-# @todo:重置投资理财
-# @author xdh
-# @date 2014-08-19
-# @version 1.0
-#
-# 详细描述: 重置投资理财
-#
-#---------------------------------------------------------------------
-#"""Version = 2015-04-13 11:10"""
-import ChConfig
-import PlayerGoldInvest
-import PlayerControl
-import GameWorld
-#---------------------------------------------------------------------
-
-#逻辑实现
-## GM命令执行入口
-# @param curPlayer 当前玩家
-# @param list 参数列表 [npcID]
-# @return None
-# @remarks 函数详细说明.
-def OnExec(curPlayer, msgList):
-
- if not msgList:
- GameWorld.DebugAnswer(curPlayer, "重置所有投资: ClearInvest 0")
- GameWorld.DebugAnswer(curPlayer, "重置指定投资: ClearInvest 类型")
- GameWorld.DebugAnswer(curPlayer, "激活指定投资: ClearInvest A 类型")
- GameWorld.DebugAnswer(curPlayer, "类型:7-永久卡;8-周卡;9-登录卡;10-等级卡;11-boss卡;;12-终身卡;")
- return
-
- investType = msgList[0]
- if not investType:
- investTypeList = ChConfig.InvestTypeList
- elif investType == "A":
- investType = msgList[1] if len(msgList) > 1 else 0
- if investType not in ChConfig.InvestTypeList:
- GameWorld.DebugAnswer(curPlayer, "不存在该投资类型!")
- return
- PlayerGoldInvest.__DoLogicInvest(curPlayer, investType)
- GameWorld.DebugAnswer(curPlayer, "激活投资: %s" % investType)
- return
-
- elif investType not in ChConfig.InvestTypeList:
- GameWorld.DebugAnswer(curPlayer, "不存在该投资类型!")
- return
- else:
- investTypeList = [investType]
-
- for itype in investTypeList:
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestTime % itype, 0)
- for keyNum in range(ChConfig.Def_PDict_InvestKeyCount):
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestReward % (itype, keyNum), 0)
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestProgress % (itype, keyNum), 0)
- PlayerGoldInvest.Sync_InvestInfo(curPlayer, itype)
- PlayerControl.Sync_ExpRateChange(curPlayer)
- return
-
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GoldInvest.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GoldInvest.py
new file mode 100644
index 0000000..dfc4337
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GoldInvest.py
@@ -0,0 +1,56 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package GM.Commands.GoldInvest
+#
+# @todo:投资
+# @author hxp
+# @date 2025-11-10
+# @version 1.0
+#
+# 详细描述: 投资
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2025-11-10 20:30"""
+#-------------------------------------------------------------------------------
+
+import ChConfig
+import PlayerGoldInvest
+import PlayerControl
+import GameWorld
+
+def OnExec(curPlayer, msgList):
+
+ if not msgList:
+ GameWorld.DebugAnswer(curPlayer, "重置所有投资: GoldInvest 0")
+ GameWorld.DebugAnswer(curPlayer, "重置指定投资: GoldInvest 类型")
+ GameWorld.DebugAnswer(curPlayer, "激活指定投资: GoldInvest a 类型")
+ GameWorld.DebugAnswer(curPlayer, "类型:1-月卡;2-终身卡;")
+ return
+
+ value = msgList[0]
+ if value == "a":
+ investType = msgList[1] if len(msgList) > 1 else 0
+ if investType not in ChConfig.InvestTypeList:
+ GameWorld.DebugAnswer(curPlayer, "不存在该投资类型!")
+ return
+ PlayerGoldInvest.DoLogicInvest(curPlayer, investType)
+ GameWorld.DebugAnswer(curPlayer, "激活投资: %s" % investType)
+ return
+
+ if value == 0:
+ investTypeList = ChConfig.InvestTypeList
+ elif value in ChConfig.InvestTypeList:
+ investTypeList = [value]
+ else:
+ GameWorld.DebugAnswer(curPlayer, "不存在该投资类型!")
+ return
+
+ for itype in investTypeList:
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestTime % itype, 0)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestEndTime % itype, 0)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestRewardTime % itype, 0)
+ PlayerGoldInvest.Sync_InvestInfo(curPlayer, itype)
+ GameWorld.DebugAnswer(curPlayer, "重置投资类型: %s" % investTypeList)
+ return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
index 05ffe43..46527c9 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
@@ -974,6 +974,16 @@
dateTimeB = datetime.datetime(dateTimeB.year, dateTimeB.month, dateTimeB.day, 0, 0, 0)
return (dateTimeA - dateTimeB).days
+def GetEndTimeByZeroTime(startTime, addDays):
+ ## 获取结束时间,根据0点结束计算
+ # @param startTime: 起始时间戳
+ # @param addDays: 增加的天数,如果是1天实际为当天,即1代表当天
+ startDate = ChangeTimeNumToDatetime(startTime)
+ startZeroDate = datetime.datetime(startDate.year, startDate.month, startDate.day, 23, 59, 59)
+ startZeroTime = int(time.mktime(startZeroDate.timetuple()))
+ endTime = startTime + (startZeroTime - startTime) + max(addDays - 1, 0) * 24 * 3600
+ return endTime
+
#---------------------------------------------------------------------
##获取与当前时间相差天数的datetime格式数据
# @param diffDays 差距天数
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
index 7c37ebe..63d2b59 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
@@ -1619,9 +1619,10 @@
if not costType or not payMoneyList:
GameWorld.DebugLog("没有配置购买副本次数消耗货币数! mapID=%s,costType=%s,payMoneyList=%s" % (mapID, costType, payMoneyList))
return
- costMoney = payMoneyList[hasBuyCnt] if len(payMoneyList) > hasBuyCnt else payMoneyList[-1]
- if not PlayerControl.PayMoney(curPlayer, costType, costMoney, ChConfig.Def_Cost_BuyFBCnt, {"MapID":mapID}):
- return
+ if not PlayerGoldInvest.IsFBCntBuyFree(curPlayer, mapID):
+ costMoney = payMoneyList[hasBuyCnt] if len(payMoneyList) > hasBuyCnt else payMoneyList[-1]
+ if not PlayerControl.PayMoney(curPlayer, costType, costMoney, ChConfig.Def_Cost_BuyFBCnt, {"MapID":mapID}):
+ return
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FBBuyCnt % mapID, hasBuyCnt + 1)
Sync_FBPlayerFBInfoData(curPlayer, mapID)
return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 50bbece..ca7e456 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1198,15 +1198,6 @@
("list", "VIPAward", 0),
),
- "Invest":(
- ("WORD", "ID", 1),
- ("BYTE", "Type", 0),
- ("BYTE", "NeedDay", 0),
- ("WORD", "NeedLV", 0),
- ("DWORD", "NeedNPCID", 0),
- ("dict", "Reward", 0),
- ),
-
"XBXZ":(
("DWORD", "ID", 1),
("BYTE", "Type", 0),
@@ -3947,20 +3938,6 @@
def GetVIPLimit(self): return self.attrTuple[4] # 需要VIP几 BYTE
def GetVIPAward(self): return self.attrTuple[5] # vip奖励[[物品ID,个数],...] list
-# 投资表
-class IPY_Invest():
-
- def __init__(self):
- self.attrTuple = None
- return
-
- def GetID(self): return self.attrTuple[0] # ID WORD
- def GetType(self): return self.attrTuple[1] # 投资类型 BYTE
- def GetNeedDay(self): return self.attrTuple[2] # 需要天数 BYTE
- def GetNeedLV(self): return self.attrTuple[3] # 需要等级 WORD
- def GetNeedNPCID(self): return self.attrTuple[4] # 需要NPCID DWORD
- def GetReward(self): return self.attrTuple[5] # 奖励 {"key":[[物品ID,个数,是否绑定],...], ...} dict
-
# 仙宝寻主表
class IPY_XBXZ():
@@ -5741,7 +5718,6 @@
self.__LoadFileData("CTGSelectItem", onlyCheck)
self.__LoadFileData("FirstCharge", onlyCheck)
self.__LoadFileData("LVAward", onlyCheck)
- self.__LoadFileData("Invest", onlyCheck)
self.__LoadFileData("XBXZ", onlyCheck)
self.__LoadFileData("TreasureSet", onlyCheck)
self.__LoadFileData("TreasureHouse", onlyCheck)
@@ -6847,13 +6823,6 @@
def GetLVAwardByIndex(self, index):
self.CheckLoadData("LVAward")
return self.ipyLVAwardCache[index]
-
- def GetInvestCount(self):
- self.CheckLoadData("Invest")
- return self.ipyInvestLen
- def GetInvestByIndex(self, index):
- self.CheckLoadData("Invest")
- return self.ipyInvestCache[index]
def GetXBXZCount(self):
self.CheckLoadData("XBXZ")
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
index e77f12f..6add269 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -50,7 +50,6 @@
import CrossPlayerData
import PlayerFeastWish
import PlayerFeastTravel
-import PlayerGoldInvest
import PlayerWeekParty
import NPCRealmRefresh
import PlayerActLogin
@@ -4067,7 +4066,6 @@
if not buyTimesVIPPriID:
return
canBuyCnt = 0
- canBuyCnt += PlayerGoldInvest.GetAddBossBuyCnt(curPlayer, killBossMark)
hasBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Boss_KillCntBuyCnt%killBossMark, 0)
playerID = curPlayer.GetPlayerID()
if hasBuyCnt >= canBuyCnt:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py
index 4584fca..7dd4d13 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py
@@ -22,6 +22,7 @@
import PlayerControl
import IpyGameDataPY
import ChPyNetSendPack
+import PlayerGoldInvest
import PlayerViewCache
import NetPackCommon
import PyGameData
@@ -167,6 +168,8 @@
return
def DoArenaOpen(curPlayer):
+ storeMax = IpyGameDataPY.GetFuncCfg("ArenaSet", 3)
+ PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_ArenaTicket, storeMax, "ArenaOpen")
__DoArenaSeasonReset(curPlayer)
return
@@ -180,11 +183,11 @@
def GetArenaTicketStoreMax(curPlayer):
## 获取挑战券存储上限
- baseCnt = IpyGameDataPY.GetFuncCfg("ArenaSet", 3)
+ storeMax = IpyGameDataPY.GetFuncCfg("ArenaSet", 3)
# 其他特权提升上限
+ storeMax += PlayerGoldInvest.GetArenaTicketMax(curPlayer)
- storeMax = baseCnt
return storeMax
#// B2 09 演武场匹配玩家 #tagCSArenaMatch
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py
index ae360c7..52239dd 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py
@@ -239,6 +239,19 @@
Sync_CoinToGoldCountInfo(curPlayer, syncRecordIDList)
return
+#// A8 06 查询充值结果 #tagCMQueryRecharge
+#
+#struct tagCMQueryRecharge
+#{
+# tagHead Head;
+#};
+def OnQueryRecharge(index, packData, tick):
+ curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+ if tick - curPlayer.GetDictByKey("QRtick") < 10000:
+ return
+ curPlayer.SetDict("QRtick", tick)
+ curPlayer.SendDBQueryRecharge()
+ return
#// A1 23 查询充值次数 #tagCMQueryCoinToGoldCount
#
@@ -584,15 +597,15 @@
giveItemList += GetCTGGiveItemList(ipyData)
giveItemList += selectItemList
- payType = ipyData.GetPayType()
+ #payType = ipyData.GetPayType()
moneyType = ipyData.GetMoneyType() # 获得货币类型
addGold = ipyData.GetGainGold() # 获得货币数
gainGoldPrize = ipyData.GetGainGoldPrize() # 赠送货币数,首次充值赠送仙玉时,此仙玉不给
firstGoldPrize = ipyData.GetFirstGoldPrize() # 首次充值赠送的仙玉
prizeGold = firstGoldPrize if (not totalBuyCount and firstGoldPrize) else gainGoldPrize
if moneyType == IPY_GameWorld.TYPE_Price_Gold_Money:
- if payType in [PayType_Gold, PayType_GoldPlus] and PlayerGoldInvest.GetInvestState(curPlayer, ChConfig.InvestType_Life):
- prizeGold = addGold # bt tqxbqy 版本,永久卡仙玉直充固定双倍
+ #if payType in [PayType_Gold, PayType_GoldPlus] and PlayerGoldInvest.GetInvestState(curPlayer, ChConfig.InvestType_Life):
+ # prizeGold = addGold # bt tqxbqy 版本,永久卡仙玉直充固定双倍
actPrizeGold = PlayerActRechargePrize.DoAddPlayerActRechargePrizeCount(curPlayer, recordID)
if actPrizeGold:
prizeGold += actPrizeGold
@@ -783,7 +796,7 @@
if ctgIpyData:
ctgID = ctgIpyData.GetRecordID()
#PlayerActFamilyCTGAssist.OnPlayerCTG(curPlayer, ctgID)
- #PlayerGoldInvest.InvestByCTG(curPlayer, ctgID)
+ PlayerGoldInvest.InvestByCTG(curPlayer, ctgID)
PlayerGoldGift.OnGiftByCTGID(curPlayer, ctgID)
PlayerZhanling.OnActiviteByCTGID(curPlayer, ctgID)
PlayerGoldRush.OnGoldRushByCTGID(curPlayer, ctgID)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index 68d42a3..42003a0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -49,7 +49,6 @@
import PlayerCostRebate
import PlayerActLunhuidian
import GY_Query_CrossRealmReg
-import PlayerGoldInvest
import CrossRealmPlayer
import CrossPlayerData
import PlayerActivity
@@ -4141,7 +4140,6 @@
def Sync_ExpRateChange(curPlayer):
totalExpRate = GetPlayerExpRate(curPlayer)
fightExpRate = curPlayer.GetFightExpRate() # 系统及功能累加
- fightExpRate += PlayerGoldInvest.GetAddFightExpRate(curPlayer)
actExpRateInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_ExpRate, {})# 多倍经验活动加成
if actExpRateInfo.get(ShareDefine.ActKey_State):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldInvest.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldInvest.py
index 09d6dec..500140b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldInvest.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldInvest.py
@@ -6,96 +6,97 @@
#
# @todo:投资
# @author hxp
-# @date 2020-09-10
+# @date 2025-11-10
# @version 1.0
#
# 详细描述: 投资
#
#-------------------------------------------------------------------------------
-#"""Version = 2020-09-10 11:00"""
+#"""Version = 2025-11-10 20:30"""
#-------------------------------------------------------------------------------
import GameWorld
import IpyGameDataPY
import NetPackCommon
-import DataRecordPack
import ChPyNetSendPack
import ItemControler
import PlayerControl
-import IPY_GameWorld
+import PlayerMail
import ChConfig
import time
-## 登录
def OnLogin(curPlayer):
for investType in ChConfig.InvestTypeList:
if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestTime % investType):
+ # 有投资过就同步
continue
Sync_InvestInfo(curPlayer, investType)
return
-## 过天
def OnDay(curPlayer):
+ dayAwardDict = IpyGameDataPY.GetFuncEvalCfg("InvestDay", 3, {})
for investType in ChConfig.InvestTypeList:
if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestTime % investType):
continue
- # 登录卡
- if investType == ChConfig.InvestType_Login:
- progressValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestProgress % (investType, 0))
- maxDays = __GetInvestMaxDays(investType)
- if maxDays and progressValue < maxDays:
- progressValue += 1
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestProgress % (investType, 0), progressValue)
- GameWorld.DebugLog("更新登录投资可领奖天数进度: %s" % progressValue)
-
- # 终身卡
- elif investType == ChConfig.InvestType_Life:
- __GiveUnGetPerDayReward(curPlayer, investType)
- for keyNum in range(ChConfig.Def_PDict_InvestKeyCount):
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestReward % (investType, keyNum), 0)
-
+ # 每日相同奖励的
+ if str(investType) in dayAwardDict:
+ __GiveUnGetPerDayReward(curPlayer, investType, dayAwardDict[str(investType)])
+
Sync_InvestInfo(curPlayer, investType)
+
return
-def __GiveUnGetPerDayReward(curPlayer, investType):
+def __GiveUnGetPerDayReward(curPlayer, investType, dayAwardItemList):
## 补发未领取的每日奖励,一般用于 每日可领取的固定奖励,如永久卡等
+
+ if not dayAwardItemList:
+ return
+
playerID = curPlayer.GetPlayerID()
- curTime = int(time.time())
lastRewardTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestRewardTime % investType)
if not lastRewardTime:
- passDays = __GetInvestPassDays(curPlayer, investType)
- #GameWorld.DebugLog("补发奖励时,距离开通投资已过天数: %s" % passDays, playerID)
- else:
- passDays = GameWorld.GetDiff_Day(curTime, lastRewardTime)
- #GameWorld.DebugLog("补发奖励时,距离上次领奖已过天数: %s" % passDays, playerID)
+ investTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestTime % investType)
+ if not investTime:
+ return
+ lastRewardTime = investTime - 3600 * 24 # 让激活当天也可以领
+ #GameWorld.DebugLog("从未领奖过")
- rewardDays = passDays - 1 # # 需要补发的奖励天数,只补到昨天,不算当天
+ curTime = int(time.time())
+ passDays = GameWorld.GetDiff_Day(curTime, lastRewardTime)
+ #GameWorld.DebugLog("补发奖励时,距离上次领奖已过天数: %s" % passDays, playerID)
+ if not GetInvestState(curPlayer, investType):
+ rewardDays = passDays
+ endTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestEndTime % investType)
+ if not endTime:
+ return
+ rewardDayMax = GameWorld.GetDiff_Day(endTime, lastRewardTime)
+ if rewardDayMax <= 0:
+ return
+ GameWorld.DebugLog("已过期: 最大还可奖励天数: %s" % rewardDayMax, playerID)
+ if rewardDays > rewardDayMax:
+ rewardDays = rewardDayMax
+ GameWorld.DebugLog("修正最大还可补发的奖励天数: %s" % rewardDays, playerID)
+ else:
+ rewardDays = passDays - 1 # # 需要补发的奖励天数,只补到昨天,不算当天
+ GameWorld.DebugLog("未过期: rewardDays=%s" % rewardDays, playerID)
+
if rewardDays <= 0:
GameWorld.DebugLog("不用补发投资卡每日奖励: investType=%s,rewardDays=%s" % (investType, rewardDays), playerID)
return
updRewardTime = curTime - 3600 * 24 # 最后一次领奖强制设置到昨天
- rewardIndex = 0 # 每日奖励默认0索引
- ipyData = IpyGameDataPY.GetIpyGameData("Invest", investType * 100 + rewardIndex)
- if not ipyData:
- return
- rewardInfo = ipyData.GetReward()
-
- rewardKey = "1" # 默认1
- rewardItemList = rewardInfo.get(str(rewardKey), [])
- if not rewardItemList:
- return
-
mailItemList = []
- for itemID, itemCount, isAuctionItem in rewardItemList:
- mailItemList.append([itemID, itemCount * rewardDays, isAuctionItem])
-
+ for itemInfo in dayAwardItemList:
+ itemID = itemInfo[0]
+ itemCount = itemInfo[1]
+ mailItemList.append([itemID, itemCount * rewardDays])
+
GameWorld.DebugLog("邮件补发投资卡每日奖励! investType=%s, rewardDays=%s, updRewardTime=%s, mailItemList=%s"
% (investType, rewardDays, updRewardTime, mailItemList), playerID)
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestRewardTime % investType, updRewardTime)
- PlayerControl.SendMailByKey("InvestDayReward_%s" % investType, [playerID], mailItemList, [rewardDays])
+ PlayerMail.SendMailByKey("InvestDayReward_%s" % investType, playerID, mailItemList, [rewardDays])
return
def __GetInvestPassDays(curPlayer, investType):
@@ -106,16 +107,16 @@
curTime = int(time.time())
return max(0, GameWorld.GetDiff_Day(curTime, investTime) + 1)
-def __GetInvestMaxDays(investType):
- ## 获取投资最大天数,0为永久
- investMaxDayDict = IpyGameDataPY.GetFuncEvalCfg("InvestMaxDay", 1, {})
- return investMaxDayDict.get(str(investType), 0)
-
def GetInvestState(curPlayer, investType):
- ## 获取投资卡状态 0-未投资;1-已投资;
+ ## 获取投资卡状态 0-未投资;1-投资生效中;
investTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestTime % investType)
if not investTime:
return 0
+ endTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestEndTime % investType)
+ if endTime: # 有到期时间的检查到期
+ expiredDays = GameWorld.GetDiff_Day(int(time.time()), endTime)
+ if expiredDays > 0: # 已过期
+ return 0
return 1
#// A5 40 投资理财 #tagCMGoldInvest
@@ -127,164 +128,92 @@
# DWORD InvestGold; // 投资额度
#};
def OnGoldInvest(index, clientData, tick):
- curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
- investType = clientData.InvestType
- InvestByRealCTG(curPlayer, investType)
+ #curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+ #investType = clientData.InvestType
return
-def InvestByRealCTG(curPlayer, investType):
- ## 真实充值激活投资
- needRealCTGCoinDict = IpyGameDataPY.GetFuncEvalCfg("InvestCost", 4, {})
- if str(investType) not in needRealCTGCoinDict:
- return
- playerID = curPlayer.GetPlayerID()
- realNeed = needRealCTGCoinDict[str(investType)]
- realTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CTGRealTotal)
- if realTotal < realNeed:
- GameWorld.DebugLog("真实充值额度不足,无法激活! investType=%s,realTotal=%s < %s"
- % (investType, realTotal, realNeed), playerID)
- return
- __DoLogicInvest(curPlayer, investType)
- return True
-
-## 充值直购投资
def InvestByCTG(curPlayer, ctgID):
- ctgInvestDict = IpyGameDataPY.GetFuncEvalCfg("InvestCost", 3, {})
+ ## 充值直购投资
+ ctgInvestDict = IpyGameDataPY.GetFuncEvalCfg("InvestCost", 1, {})
for investType, ctgIDList in ctgInvestDict.items():
if ctgID in ctgIDList:
- __DoLogicInvest(curPlayer, int(investType))
+ DoLogicInvest(curPlayer, int(investType))
break
return
-## 执行投资逻辑
-def __DoLogicInvest(curPlayer, investType):
- if GetInvestState(curPlayer, investType) == 1:
- GameWorld.DebugLog("已投资,无法重复投资! investType=%s" % investType)
- return
+def DoLogicInvest(curPlayer, investType):
+ ## 执行投资逻辑
+ buyDaysDict = IpyGameDataPY.GetFuncEvalCfg("InvestDay", 1, {}) # 购买天数
+ buyDays = buyDaysDict.get(str(investType), 0)
+ curState = GetInvestState(curPlayer, investType)
+ GameWorld.DebugLog("购买投资: investType=%s,buyDays=%s,curState=%s" % (investType, buyDays, curState))
- # 可投资,更新重置投资相关数据
curTime = int(time.time())
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestTime % investType, curTime)
- for keyNum in range(ChConfig.Def_PDict_InvestKeyCount):
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestReward % (investType, keyNum), 0)
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestProgress % (investType, keyNum), 0)
-
- # 登录卡,投资当天可领奖,完成设置为1
- if investType == ChConfig.InvestType_Login:
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestProgress % (investType, 0), 1)
+ # 已过期的重置投资相关数据
+ if not curState:
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestTime % investType, curTime)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestEndTime % investType, 0)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestRewardTime % investType, 0)
- # 额外奖励物品
- awardItemDict = IpyGameDataPY.GetFuncEvalCfg("InvestCost", 5, {})
- if str(investType) in awardItemDict:
- awardItemListEx = awardItemDict[str(investType)]
- ItemControler.GivePlayerItemOrMail(curPlayer, awardItemListEx, event=["Invest", True, {"investType":investType}])
+ # 支持重复购买,累加到期时间
+ # 永久
+ if buyDays <= 0:
+ updEndTime = 0
- # 广播
- PlayerControl.WorldNotify(0, "BuyInvest_%s" % investType, [curPlayer.GetName(), __GetTotalGetGold(investType)])
-
+ # 有天数限制
+ elif buyDays > 0:
+ endTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestEndTime % investType)
+ if endTime > curTime:
+ updEndTime = endTime + buyDays * 24 * 3600
+ GameWorld.Log(" 累加时长: investType=%s,endTime=%s,updEndTime=%s"
+ % (investType, GameWorld.ChangeTimeNumToStr(endTime), GameWorld.ChangeTimeNumToStr(updEndTime)))
+ else:
+ updEndTime = GameWorld.GetEndTimeByZeroTime(curTime, buyDays)
+ GameWorld.Log(" 重新激活: investType=%s,updEndTime=%s" % (investType, GameWorld.ChangeTimeNumToStr(updEndTime)))
+
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestEndTime % investType, updEndTime)
GameWorld.DebugLog("投资理财成功: investType=%s" % (investType))
Sync_InvestInfo(curPlayer, investType)
- PlayerControl.Sync_ExpRateChange(curPlayer)
return
-def __GetTotalGetGold(investType):
- ## 获取投资预计总收益仙玉、灵石
- totalGold = 0
- ipyDataMgr = IpyGameDataPY.IPY_Data()
- for index in xrange(ipyDataMgr.GetInvestCount()):
- ipyData = ipyDataMgr.GetInvestByIndex(index)
- if ipyData.GetType() != investType:
- continue
- rewardDict = ipyData.GetReward()
- for rewardInfo in rewardDict.values():
- for itemID, itemCount, _ in rewardInfo:
- if itemID in [20, 30]: # 单位1的仙玉、灵石
- totalGold += itemCount
- return totalGold
-
-def GetAddBossCnt(curPlayer, bossFuncIndex):
- ## 获取增加的boss次数上限
- addBossCnt = 0
- if GetInvestState(curPlayer, ChConfig.InvestType_Life):
- lifeCardAddBossCntDict = IpyGameDataPY.GetFuncEvalCfg("InvestPower", 1, {})
- lifeCardAddCnt = lifeCardAddBossCntDict.get(str(bossFuncIndex), 0)
- addBossCnt += lifeCardAddCnt
- return addBossCnt
-
def GetAddFBCnt(curPlayer, mapID):
- ## 获取增加的副本次数上限
+ ## 获取增加的副本免费次数上限
addFBCnt = 0
- if GetInvestState(curPlayer, ChConfig.InvestType_Life):
- lifeCardAddFBCntDict = IpyGameDataPY.GetFuncEvalCfg("InvestPower", 2, {})
- lifeCardAddCnt = lifeCardAddFBCntDict.get(str(mapID), 0)
- addFBCnt += lifeCardAddCnt
return addFBCnt
-
-def GetAddBossBuyCnt(curPlayer, bossFuncIndex):
- ## 获取增加的boss购买次数上限
- addBossBuyCnt = 0
- if GetInvestState(curPlayer, ChConfig.InvestType_Life):
- lifeCardAddBossCntDict = IpyGameDataPY.GetFuncEvalCfg("InvestPower", 4, {})
- lifeCardAddCnt = lifeCardAddBossCntDict.get(str(bossFuncIndex), 0)
- addBossBuyCnt += lifeCardAddCnt
- return addBossBuyCnt
def GetAddFBBuyCnt(curPlayer, mapID):
## 获取增加的副本购买次数上限
addFBBuyCnt = 0
- if GetInvestState(curPlayer, ChConfig.InvestType_Life):
- lifeCardAddFBCntDict = IpyGameDataPY.GetFuncEvalCfg("InvestPower", 5, {})
- lifeCardAddCnt = lifeCardAddFBCntDict.get(str(mapID), 0)
- addFBBuyCnt += lifeCardAddCnt
+ addFBBuyCntDict = IpyGameDataPY.GetFuncEvalCfg("InvestPower", 1, {})
+ for investType, fbMapIDAddDict in addFBBuyCntDict.items():
+ addCnt = fbMapIDAddDict.get(str(mapID), 0)
+ if not addCnt:
+ continue
+ if not GetInvestState(curPlayer, int(investType)):
+ continue
+ addFBBuyCnt += addCnt
return addFBBuyCnt
-def GetAddFightExpRate(curPlayer):
- ## 杀怪经验加成
- fightExpRate = 0
- if GetInvestState(curPlayer, ChConfig.InvestType_Life):
- fightExpRate += IpyGameDataPY.GetFuncCfg("InvestPower2", 1)
- return fightExpRate
-
-def CanQuickFinishMissionFree(curPlayer):
- ## 可否免费快速完成任务
- for investType in IpyGameDataPY.GetFuncEvalCfg("InvestPower", 3):
- if GetInvestState(curPlayer, investType):
- return True
+def IsFBCntBuyFree(curPlayer, mapID):
+ ## 副本付费次数购买免费
+ freeSweepDict = IpyGameDataPY.GetFuncEvalCfg("InvestPower", 2, {})
+ for investType, fbMapIDList in freeSweepDict.items():
+ if mapID not in fbMapIDList:
+ continue
+ if not GetInvestState(curPlayer, int(investType)):
+ continue
+ return True
return False
-def OnKillBoss(curPlayer, npcID):
- ## 参与击杀boss
- if GetInvestState(curPlayer, ChConfig.InvestType_Boss) != 1:
- #GameWorld.DebugLog("boss投资未投资!")
- return
- key = "BossInvestNPCIDDict"
- BossInvestNPCIDDict = IpyGameDataPY.GetConfigEx(key)
- if not BossInvestNPCIDDict:
- BossInvestNPCIDDict = {}
- ipyDataMgr = IpyGameDataPY.IPY_Data()
- for index in xrange(ipyDataMgr.GetInvestCount()):
- ipyData = ipyDataMgr.GetInvestByIndex(index)
- if ipyData.GetType() != ChConfig.InvestType_Boss:
- continue
- if not ipyData.GetNeedNPCID():
- continue
- BossInvestNPCIDDict[ipyData.GetNeedNPCID()] = ipyData.GetID()
- IpyGameDataPY.SetConfigEx(key, BossInvestNPCIDDict)
- GameWorld.Log("缓存boss投资对应关系: %s" % BossInvestNPCIDDict)
-
- if npcID not in BossInvestNPCIDDict:
- #GameWorld.DebugLog(" 该boss没有投资奖励!")
- return
- investID = BossInvestNPCIDDict[npcID]
- investType, rewardIndex = investID / 100, investID % 100
- if GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_InvestProgress, rewardIndex, True, [investType]):
- #GameWorld.DebugLog("已设置击杀过该投资boss: npcID=%s,rewardIndex=%s,progressValue=%s" % (npcID, rewardIndex, progressValue))
- return
- progressValue, updProgressValue = GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_InvestProgress, rewardIndex, 1, True, [investType])
- Sync_InvestInfo(curPlayer, investType)
- GameWorld.DebugLog("设置杀过投资boss: npcID=%s,rewardIndex=%s,progressValue=%s,updProgressValue=%s"
- % (npcID, rewardIndex, progressValue, updProgressValue))
- return
+def GetArenaTicketMax(curPlayer):
+ ## 演武场门票上限
+ addMax = 0
+ arenaCntDict = IpyGameDataPY.GetFuncEvalCfg("InvestPower", 3, {})
+ for investType, addCnt in arenaCntDict.items():
+ if not GetInvestState(curPlayer, int(investType)):
+ continue
+ addMax += addCnt
+ return addMax
#// A5 41 领取投资理财回报 #tagCMGetInvestReward
#
@@ -308,116 +237,42 @@
GameWorld.DebugLog(" 未投资或已过期,无法领奖!")
return
- ipyData = IpyGameDataPY.GetIpyGameData("Invest", investType * 100 + rewardIndex)
- if not ipyData:
- return
-
- needLV = ipyData.GetNeedLV()
- if needLV and curPlayer.GetLV() < needLV:
- GameWorld.DebugLog(" 等级不足,无法领奖! needLV=%s" % needLV)
- return
-
- if GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_InvestReward, rewardIndex, True, [investType]):
- GameWorld.DebugLog(" 已领取过该索引奖励! rewardIndex=%s" % rewardIndex)
- return
-
- needDay = ipyData.GetNeedDay()
- rewardInfo = ipyData.GetReward()
-
- indexProgressState = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_InvestProgress, rewardIndex, True, [investType])
-
- # 月卡
- if investType in [ChConfig.InvestType_NewMonth, ChConfig.InvestType_Month1]:
- passDays = __GetInvestPassDays(curPlayer, investType) # 按投资时间计算天
- if needDay > passDays:
- GameWorld.DebugLog(" 投资天数不足,无法领取! needDay=%s > passDays=%s" % (ipyData.GetNeedDay(), passDays))
- return
-
- # 登录
- elif investType == ChConfig.InvestType_Login:
- loginDays = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestProgress % (investType, 0)) # 按登录天计算天,有登录才算
- if needDay > loginDays:
- GameWorld.DebugLog(" 登录投资天数不足,无法领取! needDay=%s > loginDays=%s" % (needDay, loginDays))
- return
-
- # 等级
- elif investType == ChConfig.InvestType_LV:
- # 公共等级条件已判断
- pass
-
- # Boss
- elif investType == ChConfig.InvestType_Boss:
- if not indexProgressState:
- GameWorld.DebugLog(" Boss投资无参与击杀该boss,无法领取! rewardIndex=%s" % (rewardIndex))
- return
-
- # 终身卡
- elif investType == ChConfig.InvestType_Life:
- pass
-
- else:
- return
-
- if not ipyData:
- return
-
- rewardKey = "1" # 默认1
- rewardItemList = rewardInfo.get(str(rewardKey), [])
+ curTime = int(time.time())
+ rewardItemList = []
+ # 按每天固定奖励的
+ if rewardIndex == 0:
+ lastRewardTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestRewardTime % investType)
+ if lastRewardTime:
+ if GameWorld.GetDiff_Day(curTime, lastRewardTime) == 0:
+ GameWorld.DebugLog(" 已领取过该索引奖励! rewardIndex=%s" % rewardIndex)
+ return
+
+ dayAwardDict = IpyGameDataPY.GetFuncEvalCfg("InvestDay", 3, {})
+ if str(investType) in dayAwardDict:
+ rewardItemList = dayAwardDict[str(investType)]
+
if not rewardItemList:
return
- if not ItemControler.CheckPackSpaceEnough(curPlayer, rewardItemList):
- return
-
- rewardValue, updRewardValue = GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_InvestReward, rewardIndex, 1, True, [investType])
- Sync_InvestInfo(curPlayer, investType)
- GameWorld.DebugLog(" rewardValue=%s,updRewardValue=%s,rewardItemList=%s" % (rewardValue, updRewardValue, rewardItemList))
-
- # 记录最后一次领奖时间
- if investType == ChConfig.InvestType_Life:
+ if rewardIndex == 0:
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestRewardTime % (investType), int(time.time()))
-
- for itemID, itemCount, isAuctionItem in rewardItemList:
- ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem],
- event=["Invest", False, {}])
- ItemControler.NotifyGiveAwardInfo(curPlayer, rewardItemList, "Invest")
-
- # 记录领取事件
- DataRecordPack.DR_GetGoldInvestReward(curPlayer, investType, rewardIndex, rewardItemList)
-
- # 领完了,重置可重复购买的非永久卡
- maxDays = __GetInvestMaxDays(investType)
- canRepetBuyTypeList = IpyGameDataPY.GetFuncEvalCfg("InvestMaxDay", 2)
- if maxDays > 1 and investType in canRepetBuyTypeList:
- isAllDayGet = True
- for i in range(maxDays, -1, -1):
- if not IpyGameDataPY.GetIpyGameDataNotLog("Invest", investType * 100 + i):
- continue
- if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_InvestReward, i, True, [investType]):
- isAllDayGet = False
- #GameWorld.DebugLog(" 还有未领取: i=%s,isAllDayGet=%s" % (i, isAllDayGet))
- break
-
- if isAllDayGet:
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestTime % investType, 0)
- for keyNum in range(ChConfig.Def_PDict_InvestKeyCount):
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestReward % (investType, keyNum), 0)
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestProgress % (investType, keyNum), 0)
- Sync_InvestInfo(curPlayer, investType)
- GameWorld.DebugLog(" 领完奖励了,重置投资! investType=%s" % investType)
-
+ GameWorld.DebugLog("更新领奖:investType=%s,rewardItemList=%s" % (investType, rewardItemList))
+ Sync_InvestInfo(curPlayer, investType)
+ ItemControler.GivePlayerItemOrMail(curPlayer, rewardItemList, event=["Invest", False, {}])
return
-## 同步投资理财信息
+def __todayAwardState(curPlayer, investType):
+ lastRewardTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestRewardTime % investType)
+ if lastRewardTime:
+ if GameWorld.GetDiff_Day(int(time.time()), lastRewardTime) == 0:
+ return 1
+ return 0
+
def Sync_InvestInfo(curPlayer, investType):
- investInfoPack = ChPyNetSendPack.tagMCInvestInfo()
- investInfoPack.InvestType = investType
- investInfoPack.CurDay = __GetInvestPassDays(curPlayer, investType)
- for keyNum in range(ChConfig.Def_PDict_InvestKeyCount):
- investInfoPack.RewardValue.append(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestReward % (investType, keyNum)))
- investInfoPack.ProgressValue.append(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestProgress % (investType, keyNum)))
- investInfoPack.ValueCount = len(investInfoPack.RewardValue)
- NetPackCommon.SendFakePack(curPlayer, investInfoPack)
+ clientPack = ChPyNetSendPack.tagSCInvestInfo()
+ clientPack.InvestType = investType
+ clientPack.InvestBuyTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestTime % investType)
+ clientPack.InvestEndTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestEndTime % investType)
+ clientPack.AwardState = __todayAwardState(curPlayer, investType)
+ NetPackCommon.SendFakePack(curPlayer, clientPack)
return
-
-
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerVip.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerVip.py
deleted file mode 100644
index 04544db..0000000
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerVip.py
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/usr/bin/python
-# -*- coding: GBK -*-
-#---------------------------------------------------------------------
-#
-#---------------------------------------------------------------------
-##@package PlayerVip
-# @todo: 玩家VIP逻辑
-#
-# @author: sgj
-# @date 2017-10-24
-# @version 1.0
-#
-# @note:
-#
-#---------------------------------------------------------------------
-#"""Version = 2017-10-23 16:40"""
-#---------------------------------------------------------------------
-
-import GameWorld
-
-#===============================================================================
-# // A8 06 查询充值结果 #tagCMQueryRecharge
-#
-# struct tagCMQueryRecharge
-# {
-# tagHead Head;
-# };
-#===============================================================================
-def OnQueryRecharge(index, packData, tick):
- curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
- if tick - curPlayer.GetDictByKey("QRtick") < 10000:
- return
- curPlayer.SetDict("QRtick", tick)
- curPlayer.SendDBQueryRecharge()
- return
-
--
Gitblit v1.8.0