| | |
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2017-12-22 14:00"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | import ChConfig
|
| | | import FBCommon
|
| | | import GameWorld
|
| | | import IpyGameDataPY
|
| | | import IPY_GameWorld
|
| | | import GameWorldProcess
|
| | | import NPCCustomRefresh
|
| | | import ChConfig
|
| | | import ShareDefine
|
| | | import ItemControler
|
| | | import PlayerControl
|
| | | import EventShell
|
| | | import EventReport
|
| | |
|
| | |
|
| | | #---副本配置对应key值---
|
| | | (
|
| | | Def_PrepareTime, # 副本准备时间(秒)
|
| | | Def_FightTime, # 进行时间(秒)
|
| | | Def_LeaveTime, # 退出时间(秒)
|
| | | ) = range(3)
|
| | |
|
| | | (
|
| | | DL_RefreshMark, # 刷怪标识点
|
| | | DL_NPCID, # NPCID
|
| | | DL_SingleNPCCnt, # 单次刷NPC个数
|
| | | DL_maxCnt, #当前点最大怪物数
|
| | | DL_TotalNPCCnt, # 累计刷NPC总个数
|
| | | DL_NeedKillCnt, # 需要击杀数量
|
| | | DL_RefreshCD, # 刷新间隔
|
| | | ) = range(7)
|
| | |
|
| | |
|
| | | #当前副本地图的状态
|
| | | (
|
| | | FB_Step_Open, # 副本开启
|
| | | FB_Step_Prepare, # 副本等待
|
| | | FB_Step_Fighting, # 副本进行中
|
| | | FB_Step_Over, # 副本结束
|
| | | FB_Step_Close, # 副本关闭
|
| | | ) = range(5)
|
| | |
|
| | | #副本进行的关卡
|
| | | (
|
| | | Def_Prepare, # 准备
|
| | | Def_KillBandit, # 击杀强盗
|
| | | Def_BreakCage, # 破坏笼子
|
| | | Def_Dialog, # 与幼龙对话
|
| | | Def_EndGuard, # 结束
|
| | | ) = range(5)
|
| | |
|
| | | FBPlayerDict_GameStep = 'FBPlayerDict_GameStep' #关卡
|
| | | FBPlayerDict_NPCKillCnt = 'FBPlayerDict_NPCKillCnt' # NPC已击杀数量
|
| | | FBPlayerDict_NPCNeedKillCnt = 'FBPlayerDict_NPCNeedKillCnt' # NPC需要击杀数量
|
| | |
|
| | | FBPlayerDict_TotalExp = 'FBPlayerDict_TotalExp' # 获得的总经验
|
| | | FBPlayerDict_TotalExpPoint = 'FBPlayerDict_TotalExpPoint' # 获得的总经验点
|
| | |
|
| | |
|
| | | ##---获得副本配置---
|
| | | # @param None
|
| | | # @return 配置信息
|
| | | def GetGuardTimeCfg():
|
| | | return FBCommon.GetFBLineStepTime(GameWorld.GetMap().GetMapID(), 0)
|
| | |
|
| | | ##开启副本
|
| | | # @param tick 时间戳
|
| | | # @return 返回值无意义
|
| | | # @remarks 开启副本
|
| | | def OnOpenFB(tick):
|
| | | FBCommon.OpenOrCloseDoorEx([IpyGameDataPY.GetFuncCfg('GuardFBCageNPCID', 2)], 0)
|
| | | return
|
| | |
|
| | | ## 是否能够通过活动查询进入
|
| | | # @param curPlayer 玩家实例
|
| | |
| | | # @param tick 时间戳
|
| | | # @return 布尔值
|
| | | def OnEnterFBEvent(curPlayer, mapID, lineID, tick):
|
| | | return True
|
| | |
|
| | |
|
| | | ##副本玩家进入点
|
| | | # @param curPlayer 玩家实例
|
| | | # @param mapID 地图ID
|
| | | # @param lineId 分线ID
|
| | | # @param ipyEnterPosInfo 功能线路IPY配置坐标信息
|
| | | # @param tick 时间戳
|
| | | # @return posX, posY, 随机半径(可选)
|
| | | def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick):
|
| | | return ipyEnterPosInfo
|
| | |
|
| | |
|
| | | ##查询是否可以进入地图
|
| | | # @param ask:请求结构体(IPY_BMChangeMapAsk)
|
| | | # @param tick:时间戳
|
| | | # @return IPY_GameWorld.cme 枚举
|
| | | def OnChangeMapAsk(ask, tick):
|
| | | return IPY_GameWorld.cmeAccept
|
| | |
|
| | | def SetMap_Guard_GameStep(gameStep):
|
| | | ## 设置副本步骤
|
| | | GameWorld.GetGameFB().SetGameFBDict(FBPlayerDict_GameStep, gameStep)
|
| | | |
| | | return
|
| | | ## 进副本
|
| | | # @param curPlayer
|
| | | # @param tick
|
| | | # @return None
|
| | | def DoEnterFB(curPlayer, tick):
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | playerLV = curPlayer.GetLV()
|
| | | mapID = GameWorld.GetMap().GetMapID()
|
| | | mapID = FBCommon.GetRecordMapID(mapID)
|
| | | gameFB = GameWorld.GetGameFB()
|
| | | |
| | | GameWorld.DebugLog("DoEnterFB...,playerLV=%s" % (playerLV), playerID)
|
| | | hadDelTicket = FBCommon.GetHadDelTicket(curPlayer)
|
| | | if not hadDelTicket:
|
| | | FBCommon.SetHadDelTicket(curPlayer)
|
| | | |
| | | # 新手剧情副本重置所有技能CD
|
| | | skillManager = curPlayer.GetSkillManager()
|
| | | for i in range(0, skillManager.GetSkillCount()):
|
| | | curSkill = skillManager.GetSkillByIndex(i)
|
| | | if curSkill.GetRemainTime() != 0:
|
| | | curSkill.SetRemainTime(0)
|
| | | curSkill.Sync_Skill()
|
| | | EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_Guard, 0, ChConfig.CME_Log_Start)
|
| | | GameWorld.DebugLog("此副本刚进入时不直接开始,需等前端通知开始才开始!", playerID) # 掉线重上强制开始 |
| | | return
|
| | |
|
| | | fbStep = gameFB.GetFBStep()
|
| | | if fbStep < FB_Step_Prepare:
|
| | | FBCommon.SetFBStep(FB_Step_Prepare, tick)
|
| | | |
| | | if fbStep <= FB_Step_Prepare:
|
| | | notify_tick = GetGuardTimeCfg()[Def_PrepareTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())
|
| | | curPlayer.Sync_TimeTick(IPY_GameWorld.tttWaitStart, 0, max(notify_tick, 0), True)
|
| | | |
| | | elif fbStep == FB_Step_Fighting:
|
| | | notify_tick = GetGuardTimeCfg()[Def_FightTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())
|
| | | curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, max(notify_tick, 0), True)
|
| | | |
| | | DoFBHelp(curPlayer, tick)
|
| | | return
|
| | |
|
| | | ## 客户端发送开始副本
|
| | | def OnClientStartFB(curPlayer, tick):
|
| | | gameFB = GameWorld.GetGameFB()
|
| | | fbStep = gameFB.GetFBStep()
|
| | | if fbStep >= FB_Step_Prepare:
|
| | | GameWorld.ErrLog("前端请求正式开始副本, 但副本已经开始了,不可重复开始!", curPlayer.GetPlayerID())
|
| | | return
|
| | | |
| | | GameWorld.DebugLog("前端场景秀已播放完毕,请求正式开始副本!", curPlayer.GetPlayerID())
|
| | | FBCommon.SetFBStep(FB_Step_Prepare, tick)
|
| | | notify_tick = GetGuardTimeCfg()[Def_PrepareTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())
|
| | | curPlayer.Sync_TimeTick(IPY_GameWorld.tttWaitStart, 0, max(notify_tick, 0), True)
|
| | | DoFBHelp(curPlayer, tick)
|
| | | return
|
| | |
|
| | | ##玩家退出副本
|
| | | # @param curPlayer 玩家实例
|
| | | # @param tick 时间戳
|
| | | # @return 无意义
|
| | | def DoExitFB(curPlayer, tick):
|
| | | step = GameWorld.GetGameFB().GetGameFBDictByKey(FBPlayerDict_GameStep)
|
| | | if step == Def_EndGuard:
|
| | | itemID, giveExp = FBCommon.GetFBLineReward(GameWorld.GetMap().GetMapID(), 0)
|
| | | if itemID:
|
| | | ItemControler.GivePlayerItem(curPlayer, itemID, 1, 0, [IPY_GameWorld.rptItem, IPY_GameWorld.rptAnyWhere])
|
| | | |
| | | # 新手本玩家退出默认关闭副本
|
| | | GameWorldProcess.CloseFB(tick)
|
| | | return
|
| | |
|
| | | ##玩家主动离开副本.
|
| | | # @param curPlayer 玩家实例
|
| | | # @param tick 时间戳
|
| | | # @return 返回值无意义
|
| | | def DoPlayerLeaveFB(curPlayer, tick):
|
| | | return
|
| | |
|
| | | ## 获得副本帮助信息
|
| | | # @param curPlayer 当前玩家(被通知对象)
|
| | | # @param tick 当前时间
|
| | | # @return None
|
| | | def DoFBHelp(curPlayer, tick):
|
| | | gameFB = GameWorld.GetGameFB()
|
| | | |
| | | step = gameFB.GetGameFBDictByKey(FBPlayerDict_GameStep)
|
| | | helpDict = {FBCommon.Help_step:step, FBCommon.Help_npcTotal:gameFB.GetGameFBDictByKey(FBPlayerDict_NPCKillCnt)}
|
| | | cageNPCID = IpyGameDataPY.GetFuncCfg('GuardFBCageNPCID')
|
| | | helpDict[FBCommon.Help_npc] = FBCommon.GetJsonNPCKillList({cageNPCID:int(step>Def_BreakCage)})
|
| | | helpDict["talkOver"] = int(step>Def_Dialog)
|
| | | #副本帮助
|
| | | GameWorld.DebugLog("DoFBHelp %s" % str(helpDict))
|
| | | FBCommon.Notify_FBHelp(curPlayer, helpDict)
|
| | | return
|
| | |
|
| | |
|
| | | ##---副本总逻辑计时器---
|
| | | # @param tick:时间戳
|
| | | # @return 无意义
|
| | | # @remarks 副本总逻辑计时器
|
| | | def OnProcess(tick):
|
| | | fbStep = GameWorld.GetGameFB().GetFBStep()
|
| | | |
| | | # 副本准备
|
| | | if fbStep == FB_Step_Prepare:
|
| | | __DoLogic_FB_Prepare(tick) |
| | | # 副本进行中
|
| | | elif fbStep == FB_Step_Fighting:
|
| | | __DoLogic_FB_Fighting(tick)
|
| | | # 副本结束
|
| | | elif fbStep == FB_Step_Over:
|
| | | __DoLogic_FB_Over(tick)
|
| | | |
| | | return
|
| | |
|
| | | ## 副本准备逻辑
|
| | | # @param tick:时间戳
|
| | | # @return 无意义
|
| | | def __DoLogic_FB_Prepare(tick):
|
| | | #gameFB = GameWorld.GetGameFB()
|
| | | fbCfg = GetGuardTimeCfg()
|
| | | # 间隔未到
|
| | | if tick - GameWorld.GetGameFB().GetFBStepTick() < fbCfg[Def_PrepareTime] * 1000:
|
| | | return
|
| | | FBCommon.OpenOrCloseDoorEx([IpyGameDataPY.GetFuncCfg('GuardFBCageNPCID', 2)], 1)
|
| | | # 设置开始刷怪
|
| | | mapID = GameWorld.GetMap().GetMapID()
|
| | | gameFB = GameWorld.GetGameFB()
|
| | | cageNPCID = IpyGameDataPY.GetFuncCfg('GuardFBCageNPCID')
|
| | | refreshIDList = FBCommon.GetFBLineRefreshNPC(mapID)
|
| | | needKillCnt = 0
|
| | | for refreshID in refreshIDList:
|
| | | npcCountList = NPCCustomRefresh.GetNPCRefreshCountList(refreshID)
|
| | | if not npcCountList:
|
| | | continue
|
| | | for npcID, count in npcCountList:
|
| | | if npcID == cageNPCID:
|
| | | continue
|
| | | needKillCnt += count
|
| | | |
| | | gameFB.SetGameFBDict(FBPlayerDict_NPCNeedKillCnt, needKillCnt)
|
| | | |
| | | for refreshID in refreshIDList:
|
| | | NPCCustomRefresh.SetNPCRefreshByID(refreshID)
|
| | | |
| | | SetMap_Guard_GameStep(Def_KillBandit)
|
| | | playerManager = GameWorld.GetMapCopyPlayerManager()
|
| | | if playerManager.GetPlayerCount() > 0:
|
| | | curPlayer = playerManager.GetPlayerByIndex(0)
|
| | | DoFBHelp(curPlayer, tick)
|
| | | |
| | | FBCommon.SetFBStep(FB_Step_Fighting, tick)
|
| | | |
| | | FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttTowerTake, fbCfg[Def_FightTime] * 1000)
|
| | | return
|
| | |
|
| | |
|
| | | ## 副本进行中
|
| | | # @param tick:时间戳
|
| | | # @return 无意义
|
| | | def __DoLogic_FB_Fighting(tick):
|
| | | fbCfg = GetGuardTimeCfg()
|
| | | # 间隔未到
|
| | | if tick - GameWorld.GetGameFB().GetFBStepTick() < fbCfg[Def_FightTime] * 1000:
|
| | | return
|
| | | |
| | | __DoGuardOver(False)
|
| | | return
|
| | |
|
| | | |
| | | ##副本关闭中
|
| | | # @param tick:时间戳
|
| | | # @return 无意义
|
| | | # @remarks 副本关闭中
|
| | | def __DoLogic_FB_Over(tick):
|
| | |
|
| | | #gameFB = GameWorld.GetGameFB()
|
| | | fbCfg = GetGuardTimeCfg()
|
| | | # 间隔未到
|
| | | if tick - GameWorld.GetGameFB().GetFBStepTick() < fbCfg[Def_LeaveTime] * 1000:
|
| | | return
|
| | | |
| | | #副本关闭
|
| | | GameWorldProcess.CloseFB(tick)
|
| | | FBCommon.SetFBStep(FB_Step_Close, tick)
|
| | | return
|
| | |
|
| | | ## 获得经验
|
| | | # @param curPlayer 当前玩家
|
| | | # @param addExp 获得的经验
|
| | | # @param expViewType 经验类型
|
| | | # @return True or False
|
| | | def OnGetExp(curPlayer, addExp, expViewType):
|
| | | |
| | | if expViewType != ShareDefine.Def_ViewExpType_KillNPC:
|
| | | return
|
| | | |
| | | playerID = curPlayer.GetID() |
| | | gameFB = GameWorld.GetGameFB()
|
| | | exp = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_TotalExp)
|
| | | expPoint = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_TotalExpPoint)
|
| | | totalExp = expPoint * ChConfig.Def_PerPointValue + exp
|
| | | updTotalExp = totalExp + addExp
|
| | | updExp = updTotalExp % ChConfig.Def_PerPointValue
|
| | | updExpPoint = updTotalExp / ChConfig.Def_PerPointValue
|
| | | gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_TotalExp, updExp)
|
| | | gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_TotalExpPoint, updExpPoint)
|
| | | |
| | | |
| | | GameWorld.DebugLog("OnGetExp() totalExp=%s,addExp=%s,updTotalExp=%s" |
| | | % (totalExp, addExp, updTotalExp), playerID)
|
| | | |
| | | return
|
| | |
|
| | | ## 执行副本杀怪逻辑
|
| | | # @param curPlayer 杀怪的人
|
| | | # @param curNPC 被杀的怪
|
| | | # @param tick 当前时间
|
| | | # @return None
|
| | | def DoFB_Player_KillNPC(curPlayer, curNPC, tick):
|
| | | gameFB = GameWorld.GetGameFB()
|
| | | fbStep = gameFB.GetFBStep()
|
| | | if fbStep != FB_Step_Fighting:
|
| | | return
|
| | | cageNPCID = IpyGameDataPY.GetFuncCfg('GuardFBCageNPCID')
|
| | | npcid = curNPC.GetNPCID()
|
| | | if not npcid:
|
| | | return
|
| | | if npcid == cageNPCID:
|
| | | #笼子打掉了触发任务可对话
|
| | | EventShell.EventRespons_FBEvent(curPlayer, "guardfbtalk")
|
| | | SetMap_Guard_GameStep(Def_Dialog)
|
| | | else:
|
| | | killCnt = gameFB.GetGameFBDictByKey(FBPlayerDict_NPCKillCnt)
|
| | | gameFB.SetGameFBDict(FBPlayerDict_NPCKillCnt, killCnt+1)
|
| | | if killCnt+1 >= gameFB.GetGameFBDictByKey(FBPlayerDict_NPCNeedKillCnt):
|
| | | SetMap_Guard_GameStep(Def_BreakCage)
|
| | | |
| | | DoFBHelp(curPlayer, tick)
|
| | | return
|
| | |
|
| | |
|
| | | ## 检查是否可攻击, 主判定不可攻击的情况,其他逻辑由外层决定
|
| | | # @param attacker 攻击方
|
| | | # @param defender 防守方
|
| | | # @return bool
|
| | | def CheckCanAttackTagObjInFB(attacker, defender):
|
| | | gameFB = GameWorld.GetGameFB()
|
| | | if gameFB.GetFBStep() != FB_Step_Fighting:
|
| | | hasEnter = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID, False, [mapID])
|
| | | if hasEnter:
|
| | | GameWorld.DebugLog(" 已进入过副本%s" % lineID)
|
| | | return False
|
| | |
|
| | | gameFB = GameWorld.GetGameFB()
|
| | | cageNPCID = IpyGameDataPY.GetFuncCfg('GuardFBCageNPCID')
|
| | | step = gameFB.GetGameFBDictByKey(FBPlayerDict_GameStep)
|
| | | if step != Def_BreakCage:
|
| | | defenderObjType = defender.GetGameObjType()
|
| | | # 攻击笼子
|
| | | if defenderObjType == IPY_GameWorld.gotNPC and defender.GetNPCID() == cageNPCID:
|
| | | return False
|
| | | |
| | | return True
|
| | |
|
| | | ## 任务专用,触发事件(副本内完成某任务)
|
| | | # @param curPlayer:玩家实例
|
| | | # @param isAchieve:是否完成任务
|
| | | # @return None
|
| | | def DoFB_OnAchieveTask(curPlayer, isAchieve):
|
| | | if GameWorld.GetGameFB().GetGameFBDictByKey(FBPlayerDict_GameStep) != Def_Dialog:
|
| | | return
|
| | | SetMap_Guard_GameStep(Def_EndGuard)
|
| | | DoFBHelp(curPlayer, 0)
|
| | | __DoGuardOver(True)
|
| | | return
|
| | |
|
| | | ## 是否副本复活
|
| | | # @param None
|
| | | # @return 是否副本复活
|
| | | def OnPlayerReborn():
|
| | | return True
|
| | |
|
| | | ##玩家死亡.
|
| | | # @param curPlayer:死亡的玩家 |
| | | # @param tick 时间戳
|
| | | # @return 返回值无意义
|
| | | # @remarks 玩家主动离开副本.
|
| | | def DoPlayerDead(curPlayer):
|
| | | __DoGuardOver(False)
|
| | | return
|
| | |
|
| | | ## 副本结束处理
|
| | | def __DoGuardOver(isPass):
|
| | | gameFB = GameWorld.GetGameFB()
|
| | | if gameFB.GetFBStep() == FB_Step_Over:
|
| | | return
|
| | | tick = GameWorld.GetGameWorld().GetTick()
|
| | | curPlayer = None
|
| | | playerManager = GameWorld.GetMapCopyPlayerManager()
|
| | | if playerManager.GetPlayerCount() > 0:
|
| | | curPlayer = playerManager.GetPlayerByIndex(0)
|
| | | |
| | | if not curPlayer:
|
| | | GameWorldProcess.CloseFB(tick)
|
| | | return
|
| | | |
| | | fbCfg = GetGuardTimeCfg()
|
| | | gameFB = GameWorld.GetGameFB()
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | # exp = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_TotalExp)
|
| | | # expPoint = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_TotalExpPoint)
|
| | | # totalExp = expPoint * ChConfig.Def_PerPointValue + exp
|
| | | costTime = tick - GameWorld.GetGameFB().GetFBStepTick()
|
| | | giveExp = 0
|
| | | overDict = {FBCommon.Over_isPass:int(isPass), FBCommon.Over_costTime:costTime}
|
| | | if isPass:
|
| | | itemID, giveExp = FBCommon.GetFBLineReward(GameWorld.GetMap().GetMapID(), 0)
|
| | | #物品改在退出副本时给
|
| | | #ItemControler.GivePlayerItem(curPlayer, itemID, 1, 0, [IPY_GameWorld.rptItem, IPY_GameWorld.rptAnyWhere])
|
| | | if giveExp:
|
| | | PlayerControl.PlayerControl(curPlayer).AddExp(giveExp)
|
| | | overDict[FBCommon.Over_exp] = giveExp
|
| | | if itemID:
|
| | | overDict[FBCommon.Over_itemInfo] = FBCommon.GetJsonItemList([itemID])
|
| | | |
| | | |
| | | # 通知结果
|
| | | __SendOverInfo(curPlayer, overDict)
|
| | | |
| | | # 进入离开阶段
|
| | | FBCommon.SetFBStep(FB_Step_Over, tick)
|
| | | FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttLeaveMap, fbCfg[Def_LeaveTime] * 1000)
|
| | | |
| | | return
|
| | |
|
| | | ## 发送挑战结果信息
|
| | | def __SendOverInfo(curPlayer, overDict):
|
| | | overDict[FBCommon.Over_dataMapID] = FBCommon.GetRecordMapID(GameWorld.GetMap().GetMapID())
|
| | | overDict[FBCommon.Over_lineID] = FBCommon.GetFBPropertyMark()
|
| | | GameWorld.DebugLog("__SendOverInfo overDict=%s" % (str(overDict)), curPlayer.GetPlayerID())
|
| | | FBCommon.Notify_FB_Over(curPlayer, overDict)
|
| | | return
|
| | | def OnClientEndFB(curPlayer, mapID, lineID, dataList):
|
| | | #客户端副本发送结束
|
| | | itemID, giveExp = FBCommon.GetFBLineReward(mapID, 0)
|
| | | #
|
| | | overDict = {}
|
| | | ItemControler.GivePlayerItem(curPlayer, itemID, 1, 0, [IPY_GameWorld.rptItem, IPY_GameWorld.rptAnyWhere])
|
| | | if giveExp:
|
| | | PlayerControl.PlayerControl(curPlayer).AddExp(giveExp)
|
| | | overDict[FBCommon.Over_exp] = giveExp
|
| | | if itemID:
|
| | | overDict[FBCommon.Over_itemInfo] = FBCommon.GetJsonItemList([itemID])
|
| | | GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID, 1, False, [mapID])
|
| | | FBCommon.NotifyFBOver(curPlayer,mapID,lineID,1,overDict)
|
| | | EventShell.EventRespons_FBEvent(curPlayer, "guardfbpass")
|
| | | PlayerControl.SetCustomMap(curPlayer, 0, 0)
|
| | | return |