From fba7745533989fc514ce7a8e9edc8017abd2d69e Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 29 四月 2019 17:09:33 +0800
Subject: [PATCH] 6661 【后端】【2.0】战斗需要木桩

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetNPCHP.py                       |    8 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py                                |   56 +++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintNPCInfo.py                   |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_202.py                       |   45 +++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/Player_Attack_SummonNPC.py |    6 +
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py                                                     |   56 +++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py            |   19 +-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SummonNPC.py                      |   39 ++---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/KillScreenNPC.py                  |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini                                        |    6 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py                              |   61 ++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py                                    |    9 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                                   |    6 
 13 files changed, 272 insertions(+), 43 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
index 7acab5f..23ffbe5 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -14517,6 +14517,62 @@
 
 
 #------------------------------------------------------
+# B4 0C 召唤私有专属木桩怪 #tagCMSummonPriWoodPile
+
+class  tagCMSummonPriWoodPile(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("NPCID", c_int),    
+                  ("Count", c_ubyte),    #默认1个,最多5个
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB4
+        self.SubCmd = 0x0C
+        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.Cmd = 0xB4
+        self.SubCmd = 0x0C
+        self.NPCID = 0
+        self.Count = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCMSummonPriWoodPile)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B4 0C 召唤私有专属木桩怪 //tagCMSummonPriWoodPile:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                NPCID:%d,
+                                Count:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.NPCID,
+                                self.Count
+                                )
+        return DumpString
+
+
+m_NAtagCMSummonPriWoodPile=tagCMSummonPriWoodPile()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMSummonPriWoodPile.Cmd,m_NAtagCMSummonPriWoodPile.SubCmd))] = m_NAtagCMSummonPriWoodPile
+
+
+#------------------------------------------------------
 #B4 06 战斗移动 # tagCMFightMove
 
 class  tagCMFightMove(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
index 2717c73..506f7a4 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -743,7 +743,7 @@
 Writer = hxp
 Releaser = hxp
 RegType = 0
-RegisterPackCount = 4
+RegisterPackCount = 5
 
 PacketCMD_1=0xA5
 PacketSubCMD_1=0x52
@@ -761,6 +761,10 @@
 PacketSubCMD_4=0x23
 PacketCallFunc_4=OnNPCShowEnd
 
+PacketCMD_5=0xB4
+PacketSubCMD_5=0x0C
+PacketCallFunc_5=OnSummonPriWoodPile
+
 ;资源找回
 [PlayerRecover]
 ScriptName = Player\PlayerRecover.py
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
index e828e44..3b8bb8a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
@@ -1771,13 +1771,15 @@
         elif defObj.GetType() == ChConfig.ntHelpBattleRobot:
             remainHP = min(dHP, max(GameObj.GetMaxHP(defObj)/2, remainHP)) # 助战机器人剩余血量不能少于一半
             GameObj.SetHP(defObj, remainHP)
-        
-        elif defObj.GetType() == ChConfig.ntMonsterTime:
-            UpdateTimeMonsterHP(defObj, tick)
             
         else:
             #防守方是怪物NPC,只扣其血
-            GameObj.SetHP(defObj, remainHP)
+            npcID = defObj.GetNPCID()
+            timeLostHPIpyData = IpyGameDataPY.GetIpyGameDataNotLog("NPCTimeLostHP", npcID)
+            if timeLostHPIpyData:
+                UpdateTimeMonsterHP(defObj, timeLostHPIpyData, tick)
+            else:
+                GameObj.SetHP(defObj, remainHP)
     else:
         GameWorld.ErrLog('计算伤血值时,防守方类型错误:defObjType = %s' % (defObjType))
         return resultHurtType
@@ -1799,16 +1801,11 @@
     
     return resultHurtType
 
-def UpdateTimeMonsterHP(curNPC, tick):
+def UpdateTimeMonsterHP(curNPC, ipyData, tick):
     '''
     NPC总血量 = 单人每秒掉血量*理论击杀所需时间
          掉血值 = 单人每秒掉血量+min(当前人数, 最大人数)*附加掉血量
     '''
-    
-    npcID = curNPC.GetNPCID()
-    ipyData = IpyGameDataPY.GetIpyGameData("NPCTimeLostHP", npcID)
-    if not ipyData:
-        return
         
     lastLostHPTick = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_TimeLostHPTick)
     curNPC.SetDict(ChConfig.Def_NPC_Dict_TimeLostHPTick, tick)
@@ -2372,6 +2369,8 @@
             return "Robot"
         if obj.GetType() == ChConfig.ntHelpBattleRobot:
             return "HelpRobot"
+        if obj.GetType() == ChConfig.ntPriWoodPilePVP:
+            return "P"
         
     objType = obj.GetGameNPCObjType()
     if objType == IPY_GameWorld.gnotPet:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/Player_Attack_SummonNPC.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/Player_Attack_SummonNPC.py
index 9c1d40e..e58b91c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/Player_Attack_SummonNPC.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/Player_Attack_SummonNPC.py
@@ -70,6 +70,12 @@
         #怪物的召唤兽,不考虑攻击模式问题
         return ChConfig.Type_Relation_Enemy , ChConfig.Def_PASysMessage_None
     
+    #私有木桩只能自己打自己的
+    if curTagSummonNPC.GetType() in [ChConfig.ntPriWoodPilePVE, ChConfig.ntPriWoodPilePVP]:
+        if not GameWorld.IsSameObj(curPlayer, curTagPlayer):
+            return ChConfig.Type_Relation_Friend , ChConfig.Def_PASysMessage_None
+        return ChConfig.Type_Relation_Enemy , ChConfig.Def_PASysMessage_None
+    
     #自己的召唤兽,不能攻击
     if GameWorld.IsSameObj(curPlayer, curTagPlayer) :
         return ChConfig.Type_Relation_Friend , ChConfig.Def_PASysMessage_None
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 447b606..cff6e8b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -5010,9 +5010,11 @@
 ntDestructible, #场景内可破坏的 19
 ntHelpBattleRobot, #助战机器人 20
 ntRobot, #机器人21
-ntMonsterTime, #按时间掉血的怪物 22
+ntMonsterTime, #按时间掉血的怪物 22 废弃,以是否有配置在时间掉血怪物表为准
+ntPriWoodPilePVE, #专属私有木桩 - PVE 23
+ntPriWoodPilePVP, #专属私有木桩 - PVP 24
 ntMax
-) = range(24)
+) = range(26)
 
 
 (Def_SkillFuncType_Common, #0为通用技能
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 7acab5f..23ffbe5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -14517,6 +14517,62 @@
 
 
 #------------------------------------------------------
+# B4 0C 召唤私有专属木桩怪 #tagCMSummonPriWoodPile
+
+class  tagCMSummonPriWoodPile(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("NPCID", c_int),    
+                  ("Count", c_ubyte),    #默认1个,最多5个
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB4
+        self.SubCmd = 0x0C
+        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.Cmd = 0xB4
+        self.SubCmd = 0x0C
+        self.NPCID = 0
+        self.Count = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCMSummonPriWoodPile)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B4 0C 召唤私有专属木桩怪 //tagCMSummonPriWoodPile:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                NPCID:%d,
+                                Count:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.NPCID,
+                                self.Count
+                                )
+        return DumpString
+
+
+m_NAtagCMSummonPriWoodPile=tagCMSummonPriWoodPile()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMSummonPriWoodPile.Cmd,m_NAtagCMSummonPriWoodPile.SubCmd))] = m_NAtagCMSummonPriWoodPile
+
+
+#------------------------------------------------------
 #B4 06 战斗移动 # tagCMFightMove
 
 class  tagCMFightMove(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/KillScreenNPC.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/KillScreenNPC.py
index 63682ab..1917405 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/KillScreenNPC.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/KillScreenNPC.py
@@ -83,7 +83,7 @@
         return
     if curNPC.GetCurAction() == IPY_GameWorld.laNPCDie:
         return
-    if curNPC.GetType() not in [IPY_GameWorld.ntMonster, ChConfig.ntMonsterTime]:
+    if curNPC.GetType() not in [IPY_GameWorld.ntMonster, ChConfig.ntPriWoodPilePVE, ChConfig.ntPriWoodPilePVP]:
         return
     if not curNPC.GetVisible():
         return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintNPCInfo.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintNPCInfo.py
index f32a990..10c33ba 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintNPCInfo.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintNPCInfo.py
@@ -50,7 +50,7 @@
     
     npcID = curNPC.GetNPCID()
     GameWorld.DebugAnswer(curPlayer, "-----------------------%s" % random.randint(0, 100))
-    GameWorld.DebugAnswer(curPlayer, "ObjID: %s, NPCID: %s, %s" % (curNPC.GetID(), npcID, curNPC.GetName()))
+    GameWorld.DebugAnswer(curPlayer, "ObjID: %s, NPCID: %s, %s, Type: %s" % (curNPC.GetID(), npcID, curNPC.GetName(), curNPC.GetType()))
     if FamilyRobBoss.IsHorsePetRobBoss(npcID):
         strengthenPlayerCnt = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_HorsePetRobBossPlayerCount)
         GameWorld.DebugAnswer(curPlayer, "表等级: %s, 成长等级: %s, 参与人数: %s" % (curNPC.GetLV(), curNPC.GetCurLV(), strengthenPlayerCnt))
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetNPCHP.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetNPCHP.py
index 49ffca8..b57155c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetNPCHP.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetNPCHP.py
@@ -14,10 +14,10 @@
 # 详细描述: 设置屏幕周围NPC血量
 #
 #---------------------------------------------------------------------
-"""Version = 2015-03-22 23:00"""
+#"""Version = 2015-03-22 23:00"""
 #---------------------------------------------------------------------
 
-
+import IpyGameDataPY
 import IPY_GameWorld
 import GameWorld
 import ChConfig
@@ -75,7 +75,9 @@
     return
 
 def __GMSetNPCHP(curPlayer, curNPC, setHP):
-    GameObj.SetHP(curNPC, setHP)
+    npcID = curNPC.GetNPCID()
+    isByTime = True if IpyGameDataPY.GetIpyGameDataNotLog("NPCTimeLostHP", npcID) else False
+    GameObj.SetHP(curNPC, setHP, isByTime=isByTime)
     curNPC.Notify_HPEx()
     GameWorld.DebugAnswer(curPlayer, "SetNPCHP ID=%s(%s),HP=%s" % (curNPC.GetID(), curNPC.GetNPCID(), setHP))
     return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SummonNPC.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SummonNPC.py
index c93835a..6d274af 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SummonNPC.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SummonNPC.py
@@ -21,40 +21,34 @@
 #逻辑实现
 ## 在身边刷召唤NPC <NPCID> [数量] 默认数量:1
 #  @param curPlayer 当前玩家
-#  @param list 参数列表 [tagID, NPCCount]
+#  @param paramList 参数列表 [tagID, NPCCount]
 #  @return None
 #  @remarks 函数详细说明.
-def OnExec(curPlayer, list):
-#===============================================================================
-#    #检测当前玩家是否有权限
-#    #if 
-#    #第一阶段不处理
-#===============================================================================
-    
+def OnExec(curPlayer, paramList):
     #输入命令格式错误
-    if len(list)<1 or len(list)>2:
+    if not paramList or len(paramList) > 2:
+        GameWorld.DebugAnswer(curPlayer, "SummonNPC npcID 个数")
         return
+    
     #NPC对象ID
-    tagID=list[0]
+    npcID = paramList[0]
+    npcCount = max(paramList[1] if len(paramList) > 1 else 1, 1)
+    npcData = GameWorld.GetGameData().FindNPCDataByID(npcID)
     
-    if not GameWorld.GetGameData().FindNPCDataByID(tagID):
+    if not npcData:
         return
-        
     
-    #NPC刷新数量
-    if len(list)==1:
-        #默认数量1
-        NPCCount=1
-    else:
-        #GM输入的数量
-        NPCCount=list[1]
+    npcType = npcData.GetType()
+    if npcType in [ChConfig.ntPriWoodPilePVE, ChConfig.ntPriWoodPilePVP]:
+        NPCCommon.SummonPriWoodPile(curPlayer, npcID, npcCount)
+        return
     
-    for i in range(0,NPCCount):
+    for _ in range(npcCount):
         #在玩家周围选择一个无玩家的点
-        resultPos=GameMap.GetEmptyPlaceInArea(curPlayer.GetPosX(),curPlayer.GetPosY(),6)
+        resultPos = GameMap.GetEmptyPlaceInArea(curPlayer.GetPosX(), curPlayer.GetPosY(), 6)
         #生成NPC
         summonNPC = curPlayer.SummonNewNPC()
-        summonNPC.SetNPCTypeID(tagID)
+        summonNPC.SetNPCTypeID(npcID)
         summonNPC.SetAIType(200)
         summonNPC.GetNPCAngry().Init(ChConfig.Def_SummonNPC_Angry_Count)
         #初始化
@@ -63,6 +57,7 @@
         
         #玩家召唤兽列表添加召唤兽,召唤兽添加主人
         summonNPC.Reborn(resultPos.GetPosX(), resultPos.GetPosY())
+    return
         
         
     
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
index 61e27f2..fcc507e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
@@ -15,6 +15,7 @@
 import ShareDefine
 import ChConfig
 import IPY_GameWorld
+import IpyGameDataPY
 
 # 关于血量的函数这里只包装最简单的超DWORD处理
 
@@ -47,9 +48,11 @@
     if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
         gameObj.SetHP(value, isNotify)
     else:
-        if gameObj.GetType() == ChConfig.ntMonsterTime and not isByTime and value not in [GetMaxHP(gameObj), 0]:
-            #GameWorld.DebugLog("不能设置按时间掉血的怪物血量! id=%s,npciD=%s,value=%s,isByTime=%s" % (gameObj.GetID(), gameObj.GetNPCID(), value, isByTime))
-            return
+        if gameObj.GetGameObjType() == IPY_GameWorld.gotNPC:
+            npcID = gameObj.GetNPCID()
+            if IpyGameDataPY.GetIpyGameDataNotLog("NPCTimeLostHP", npcID) and not isByTime and value not in [GetMaxHP(gameObj), 0]:
+                #GameWorld.DebugLog("不能设置按时间掉血的怪物血量! id=%s,npciD=%s,value=%s,isByTime=%s" % (gameObj.GetID(), gameObj.GetNPCID(), value, isByTime))
+                return
         gameObj.SetHPEx(value/ShareDefine.Def_PerPointValue)
         gameObj.SetHP(value%ShareDefine.Def_PerPointValue)
         
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_202.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_202.py
new file mode 100644
index 0000000..fd58232
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_202.py
@@ -0,0 +1,45 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package NPCAI.AIType_202
+#
+# @todo:专属木桩
+# @author hxp
+# @date 2019-04-29
+# @version 1.0
+#
+# 详细描述: 跟随主人
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2019-04-29 17:00"""
+#-------------------------------------------------------------------------------
+
+import IPY_GameWorld
+import NPCCommon
+import GameWorld
+import GameMap
+
+
+##AI逻辑处理
+#@param curNPC NPC实例
+#@param tick 时间戳
+#@return 返回值无意义
+def ProcessAI(curNPC, tick):
+    npcControl = NPCCommon.NPCControl(curNPC)
+    
+    if curNPC.GetCurAction() == IPY_GameWorld.laNPCDie:
+        #NPC死亡, 进入死亡倒计时
+        if npcControl.DieTick(tick) == 0:
+            return
+        
+    #刷新自己的Buff
+    npcControl.RefreshBuffState(tick)
+    
+    owner = NPCCommon.GetNpcObjOwnerDetail(curNPC)
+    if GameWorld.GetDist(curNPC.GetPosX(), curNPC.GetPosY(), owner.GetPosX(), owner.GetPosY()) > 5:
+        resetPos = GameMap.GetEmptyPlaceInArea(owner.GetPosX(), owner.GetPosY(), 2)
+        curNPC.ResetPos(resetPos.GetPosX(), resetPos.GetPosY())
+        
+    return
+
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 b5607c5..30c0148 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -1940,6 +1940,67 @@
         
     return
 
+#// B4 0C 召唤私有专属木桩怪 #tagCMSummonPriWoodPile
+#
+#struct    tagCMSummonPriWoodPile
+#{
+#    tagHead        Head;
+#    DWORD        NPCID;
+#    BYTE        Count;    //默认1个,最多5个
+#};
+def OnSummonPriWoodPile(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    npcID = clientData.NPCID
+    count = clientData.Count
+    SummonPriWoodPile(curPlayer, npcID, count)
+    return
+
+def SummonPriWoodPile(curPlayer, npcID, count):
+    ''' 召唤私有专属木桩怪
+    '''
+    
+    maxCount = 5
+    nowCount = 0
+    # 只允许存在一个私有木桩
+    indexList = range(curPlayer.GetSummonCount())
+    for index in indexList[::-1]:
+        summonNPC = curPlayer.GetSummonNPCAt(index)
+        if not summonNPC:
+            continue
+        npcType = summonNPC.GetType()
+        if npcType not in [ChConfig.ntPriWoodPilePVE, ChConfig.ntPriWoodPilePVP]:
+            continue
+        if nowCount >= maxCount or summonNPC.GetNPCID() != npcID:
+            SetDeadEx(summonNPC)
+        else:
+            nowCount += 1
+            
+    summonCount = min(count, maxCount - nowCount)
+    #GameWorld.DebugLog("召唤: count=%s,maxCount=%s,nowCount=%s,summonCount=%s" 
+    #                   % (count, maxCount, nowCount, summonCount))
+    if summonCount <= 0:
+        return
+    
+    for _ in xrange(summonCount):
+        summonNPC = curPlayer.SummonNewNPC()
+        
+        #设置召唤兽基础信息
+        summonNPC.SetNPCTypeID(npcID)
+        #初始化
+        InitNPC(summonNPC)
+        
+        #玩家召唤兽列表添加召唤兽,召唤兽添加主人
+        summonNPC.SetOwner(curPlayer)
+        summonNPC.SetDict(ChConfig.Def_NPC_Dict_SummonMapNPCPlayerID, curPlayer.GetPlayerID())
+        
+        #将召唤兽召唤出来
+        #玩家周围随机出生点
+        #技能召唤坐标 ChConfig.Def_SummonAppearDist
+        summonPos = GameMap.GetEmptyPlaceInArea(curPlayer.GetPosX(), curPlayer.GetPosY(), 3)
+        summonNPC.Reborn(summonPos.GetPosX(), summonPos.GetPosY())
+        
+    return
+
 ## 设置npc死亡及自身处理(请不要将游戏逻辑加在此函数中)
 #  @param curNPC:npc实例
 #  @return 

--
Gitblit v1.8.0