From d254a370d14e560470889eb69537bd21532bc254 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 02 三月 2026 18:58:56 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(郭嘉所有技能;增加触发类型62、63、64、65;增加效果6038;增加技能类型16-减益光环,对自己无效,原类型10为增益光环对自己有效;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py                       |   62 +++++++++++---------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py                     |    6 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6038.py |   26 ++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py                    |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py                      |   25 +++++++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                             |   18 ++++-
 6 files changed, 103 insertions(+), 38 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
index c72aff2..572c1cf 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -415,7 +415,7 @@
     def GetLayerCnt(self): return self._ipyData.GetLayerCnt()
     def GetLayerMax(self): return self._ipyData.GetLayerMax()
     def GetBuffRepeat(self): return self._ipyData.GetBuffRepeat() # Buff叠加规则
-    def GetDispersedLimit(self): return self._ipyData.GetDispersedLimit() or self._ipyData.GetSkillType() == ChConfig.Def_SkillType_Halo # 驱散限制
+    def GetDispersedLimit(self): return self._ipyData.GetDispersedLimit() or self._ipyData.GetSkillType() in ChConfig.Def_HaloSkill_List # 驱散限制
     def GetBuffRetain(self): return self._ipyData.GetBuffRetain()
     def GetFightPower(self): return self._ipyData.GetFightPower()
     
@@ -941,6 +941,7 @@
         self._mainTagIDList = [] # 主技能目标ID列表,一般用于技能拆分成多个技能效果时,子技能可能会用到主技能的对象做逻辑
         self._timing = 0 # 当前武将时间节点: 0-回合前;1-回合后
         self._angerOverflow = 0 # 怒气技能怒气溢出值,子技能也生效,因为主技能释放后怒气会被扣除,所以这里做个记录
+        self._beFrozenCnt = 0 # 本场战斗累计被冰冻次数
         
         # 统计
         self.hurtStat = 0 # 输出统计
@@ -1246,6 +1247,9 @@
     def GetTiming(self): return self._timing # 时间节点 0-回合前;1-回合后
     def SetTiming(self, timing): self._timing = timing
     
+    def GetBeFrozenCnt(self): return self._beFrozenCnt
+    def SetBeFrozenCnt(self, beFrozenCnt): self._beFrozenCnt = beFrozenCnt
+    
     def StatHurtValue(self, hurtValue):
         ## 统计输出
         self.hurtStat += hurtValue
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
index 64aeebf..517a882 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -1984,7 +1984,7 @@
         if skillData.GetSkillType() in ChConfig.Def_LstBuff_List:
             #GameWorld.DebugLogEx("    持续类buff由触发时机决定剩余时间! curID=%s,index=%s,skillID=%s,buffID=%s", curID, index, skillID, buffID)
             continue
-        if skillData.GetSkillType() == ChConfig.Def_SkillType_Halo and buff.GetOwnerID() != curID:
+        if skillData.GetSkillType() in ChConfig.Def_HaloSkill_List and buff.GetOwnerID() != curID:
             GameWorld.DebugLogEx("    光环buff非光源不处理! curID=%s,index=%s,skillID=%s,buffID=%s", curID, index, skillID, buffID)
             continue
         
@@ -2032,7 +2032,7 @@
         if skillData.GetSkillType() in ChConfig.Def_LstBuff_List:
             #GameWorld.DebugLogEx("    持续类buff由触发时机决定剩余时间! curID=%s,index=%s,skillID=%s,buffID=%s", curID, index, skillID, buffID)
             continue
-        if skillData.GetSkillType() == ChConfig.Def_SkillType_Halo and buff.GetOwnerID() != curID:
+        if skillData.GetSkillType() in ChConfig.Def_HaloSkill_List and buff.GetOwnerID() != curID:
             GameWorld.DebugLogEx("    光环buff非光源不处理! curID=%s,index=%s,skillID=%s,buffID=%s", curID, index, skillID, buffID)
             continue
         remainTime = buff.GetRemainTime()
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 75ac84c..b41cbd1 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1458,13 +1458,14 @@
    Def_SkillType_Passive      ,  #被动技能(与被动BUFF无直接关系)   7
    Def_SkillType_Revive       ,  #复活     8
    Def_SkillType_Increment    ,  #增值技能(不可清除)9  
-   Def_SkillType_Halo         ,  #光环技能  10
+   Def_SkillType_HaloPls      ,  #增益光环  10
    Def_SkillType_AtkEx        ,  #额外攻击  (一般用于额外造成的伤害,区分直接攻击)11
    Def_SkillType_Area         ,  #场景技能(buff)  12
    Def_SkillType_Summon       ,  #召唤  13
    Def_SkillType_Action       ,  #影响行为BUFF 14
    Def_SkillType_CleanBuff    ,  #清除buff类(如净化等) 15
-) = range(0, 1 + 15)
+   Def_SkillType_HaloDep      ,  #减益光环  16
+) = range(0, 1 + 16)
 
 # 以下废弃
 Def_SkillType_Aura = 10 #光环技能,旧命名  10
@@ -1492,7 +1493,8 @@
                        Def_SkillType_PassiveBuff    : IPY_GameWorld.btPassiveBuf,  # 被动技能 7 (废弃,无此定义分散为其他buff)
                        #Def_SkillType_Revive     : IPY_GameWorld.bfIncBuff,  #复活     8
                        Def_SkillType_Increment  : IPY_GameWorld.bfIncBuff,  #增值技能(不可清除)9
-                       Def_SkillType_Aura       : IPY_GameWorld.bfAura   ,  #光环技能  10
+                       Def_SkillType_HaloPls       : IPY_GameWorld.bfAura   ,  #增益光环  10
+                       Def_SkillType_HaloDep       : IPY_GameWorld.bfAura   ,  #减益光环  10
                        #Def_SkillType_Equip      : IPY_GameWorld.bfEquipBuff,#装备技能  11
                        Def_SkillType_Area       : IPY_GameWorld.bfMapBuff , #场景技能(buff)  12
                        Def_SkillType_Action     : IPY_GameWorld.bfActionBuff , #影响行为BUFF 14
@@ -1505,6 +1507,9 @@
                        Def_SkillType_PassiveLstPlsBuffAtk : IPY_GameWorld.bfProcessBuff   ,  #持续增益BUFF  3
                        
                      }
+
+# 光环技能类型
+Def_HaloSkill_List = [Def_SkillType_HaloPls, Def_SkillType_HaloDep]
 
 # 伤害型技能
 Def_HurtSkill_List = [Def_SkillType_Atk, Def_SkillType_AtkEx, Def_SkillType_LstPlsBuffAtk, Def_SkillType_PassiveLstPlsBuffAtk]
@@ -3870,7 +3875,11 @@
 TriggerWay_PursueAtk, # 追击直接攻击时 59
 TriggerWay_Frozen, # 冰冻目标时 60
 TriggerWay_AddDOTBuff, # 附加持续伤害buff时 61
-) = range(1, 1 + 61)
+TriggerWay_FriendComboHurt, # 友军连击时(包含自己)伤害类 62
+TriggerWay_FriendPursueHurt, # 友军追击时(包含自己)伤害类 63
+TriggerWay_FriendCausesFrozen, # 友方造成冰冻时(包含自己,多目标仅触发一次) 64
+TriggerWay_ComboOne, # 连击时 65
+) = range(1, 1 + 65)
 
 # 不加载的被动触发方式,一般用于本技能固定触发逻辑用的
 TriggerWayNoLoadList = [TriggerWay_CurSkillEff, TriggerWay_CurSkillEffLst]
@@ -3922,6 +3931,7 @@
 PassiveEff_AddBuffTime = 6035 # 增加buff持续时间
 PassiveEff_AddSkillUseCntLimit = 6036 # 增加7009回合数
 PassiveEff_AddDamBackPerByBuffLayer = 6037 # 增加反弹伤害万分比(根据buff层级)
+PassiveEff_AddSkillPerByBeFrozenCnt = 6038 # 增加本次技能万分比(按目标累计被冰冻次数)
 
 # 被动效果ID有触发值时就返回的
 PassiveEffHappenValueList = [PassiveEff_ChangeHurtType, PassiveEff_ImmuneControlBuff, PassiveEff_MustSuperHit, PassiveEff_SkillInvalid, 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6038.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6038.py
new file mode 100644
index 0000000..8d9e724
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6038.py
@@ -0,0 +1,26 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Skill.PassiveTrigger.PassiveEff_6038
+#
+# @todo:增加本次技能万分比(按目标累计被冰冻次数)
+# @author hxp
+# @date 2026-03-02
+# @version 1.0
+#
+# 详细描述: 增加本次技能万分比(按目标累计被冰冻次数)
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2026-03-02 19:00"""
+#-------------------------------------------------------------------------------
+
+def GetHappenValue(attacker, defender, curEffect, effSkill, effBuff, connSkill, **skillkwargs):
+    addPer = curEffect.GetEffectValue(0) # 每层增加的万分比
+    maxPer = curEffect.GetEffectValue(1) # 最大增加的万分比
+    addTotal = defender.GetBeFrozenCnt() * addPer
+    if maxPer and addTotal > maxPer:
+        addTotal = maxPer
+    #import GameWorld
+    #GameWorld.DebugLogEx("6038,addTotal=%s,defID=%s,BeFrozenCnt=%s", addTotal, defender.GetID(), defender.GetBeFrozenCnt())
+    return addTotal
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
index 46afd48..8276896 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
@@ -104,7 +104,7 @@
         
     #光环技能,默认施法者身上也必须有,时长与施法者身上的同步
     haloSrcBuff = None # 光源buff
-    if skillType == ChConfig.Def_SkillType_Halo and ownerID != curID:
+    if skillType in ChConfig.Def_HaloSkill_List and ownerID != curID:
         haloSrcBuff = buffOwner.GetBuffManager().FindBuffBySkillID(skillID, ownerID)
         if not haloSrcBuff:
             GameWorld.ErrLog("添加光环技能时找不到光源! skillID=%s,ownerID=%s" % (skillID, ownerID))
@@ -244,7 +244,7 @@
     if curBuffState:
         buffMgr.AddBuffState(curBuffState, buffID)
         
-    if skillType == ChConfig.Def_SkillType_Halo:
+    if skillType in ChConfig.Def_HaloSkill_List:
         __addHaloBuffEffObjID(curID, buff, skillID, ownerID, haloSrcBuff)
         
     if afterLogic and buffSkill:
@@ -313,6 +313,7 @@
         RefreshBuffAttr(batObj)
         
     if refreshType in [1, 2] and skillData.GetCurBuffState() == ChConfig.BatObjState_Frozen:
+        batObj.SetBeFrozenCnt(batObj.GetBeFrozenCnt() + 1) # 后面加的通用逻辑,原司马懿的暂不动代码
         __smyRecordEnemyFrozen(turnFight, batObj, curBuff)
     return
 
@@ -377,7 +378,7 @@
     curBuff.SetRemainTime(remainTime)
     SyncBuffRefresh(turnFight, batObj, curBuff)
     
-    if skillType == ChConfig.Def_SkillType_Halo and ownerID == buffObjID:
+    if skillType in ChConfig.Def_HaloSkill_List and ownerID == buffObjID:
         haloObjIDList = curBuff.GetHaloObjIDList()
         GameWorld.DebugLogEx("光环buff回合变更同步其他有效目标该光环: skillID=%s,ownerID=%s,haloObjIDList=%s", skillID, ownerID, haloObjIDList)
         batObjMgr = BattleObj.GetBatObjMgr()
@@ -480,7 +481,7 @@
     if isRefreshAttr and not noRefreshAttr:
         RefreshBuffAttr(batObj)
         
-    if skillType == ChConfig.Def_SkillType_Halo and ownerID == buffObjID:
+    if skillType in ChConfig.Def_HaloSkill_List and ownerID == buffObjID:
         haloObjIDList = curBuff.GetHaloObjIDList()
         GameWorld.DebugLogEx("光环buff删除同步删除其他有效目标该光环: skillID=%s,ownerID=%s,haloObjIDList=%s", skillID, ownerID, haloObjIDList)
         batObjMgr = BattleObj.GetBatObjMgr()
@@ -550,30 +551,32 @@
             
     if isRefreshAttr:
         RefreshBuffAttr(batObj)
-        
-    # 重新添加本阵营有效光环
+    
+    # 重新添加有效光环
     batObjMgr = BattleObj.GetBatObjMgr()
-    batLineup = batObj.GetTFBatLineup()
-    for tagObjID in batLineup.getAllPosObjIDList():
-        tagObj = batObjMgr.getBatObj(tagObjID)
-        if not tagObj.IsAlive():
-            continue
-        tagBuffMgr = tagObj.GetBuffManager()
-        for index in range(tagBuffMgr.GetBuffCount()):
-            buff = tagBuffMgr.GetBuffByIndex(index)
-            haloObjIDList = buff.GetHaloObjIDList()
-            if not haloObjIDList or objID not in haloObjIDList:
+    for faction, num in turnFight.actionSortList:
+        batFaction = turnFight.getBatFaction(faction)
+        batLineup = batFaction.getBatlineup(num)
+        for tagObjID in batLineup.getAllPosObjIDList():
+            tagObj = batObjMgr.getBatObj(tagObjID)
+            if not tagObj.IsAlive():
                 continue
-            if buff.GetOwnerID() != tagObjID:
-                # 非光源
-                continue
-            haloSkillID = buff.GetSkillID()
-            GameWorld.DebugLogEx("复活后重新添加本阵营光环: objID=%s,ownerID=%s,haloSkillID=%s", objID, tagObjID, haloSkillID)
-            haloSkill = tagObj.GetSkillManager().FindSkillByID(haloSkillID)
-            if not haloSkill:
-                DoAddBuffBySkillID(turnFight, batObj, haloSkillID, buffOwner=tagObj)
-                continue
-            OnAddBuff(turnFight, batObj, haloSkill, buffOwner=tagObj)
+            tagBuffMgr = tagObj.GetBuffManager()
+            for index in range(tagBuffMgr.GetBuffCount()):
+                buff = tagBuffMgr.GetBuffByIndex(index)
+                haloObjIDList = buff.GetHaloObjIDList()
+                if not haloObjIDList or objID not in haloObjIDList:
+                    continue
+                if buff.GetOwnerID() != tagObjID:
+                    # 非光源
+                    continue
+                haloSkillID = buff.GetSkillID()
+                GameWorld.DebugLogEx("复活后重新添加光环: objID=%s,ownerID=%s,haloSkillID=%s", objID, tagObjID, haloSkillID)
+                haloSkill = tagObj.GetSkillManager().FindSkillByID(haloSkillID)
+                if not haloSkill:
+                    DoAddBuffBySkillID(turnFight, batObj, haloSkillID, buffOwner=tagObj)
+                    continue
+                OnAddBuff(turnFight, batObj, haloSkill, buffOwner=tagObj)
             
     # 光源重新添加有效光环,根据光源是否还有效规则优化,待处理
     return
@@ -632,7 +635,12 @@
         buff = buffMgr.GetBuffByIndex(index)
         layer = max(1, buff.GetLayer())
         skillData = buff.GetSkillData()
-        
+        skillType = skillData.GetSkillType()
+        if skillType == ChConfig.Def_SkillType_HaloDep:
+            if buff.GetOwnerID() == objID:
+                #GameWorld.DebugLogEx("    减益光环对自己无效! buffSkillID=%s", skillData.GetSkillID(), objID)
+                continue
+            
         effExDict = buff.GetEffectExDict()
         for effCalcInfo, effValueEx in effExDict.items():
             effID, calcType = effCalcInfo
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
index 3f1689c..04d2139 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -755,7 +755,7 @@
     #执行添加buff
     
     #光环技能,需先添加施法者
-    if useSkill.GetSkillType() == ChConfig.Def_SkillType_Halo:
+    if useSkill.GetSkillType() in ChConfig.Def_HaloSkill_List:
         curID = curBatObj.GetID()
         skillID = useSkill.GetSkillID()
         GameWorld.DebugLogEx("光环技能先给施法者添加光源buff! skillID=%s,ownerID=%s", skillID, curID)
@@ -1640,6 +1640,7 @@
     triggerOne = False
     batType = useSkill.GetBatType()
     isAttackDirect = (isUseSkill and SkillCommon.isAttackDirectSkill(useSkill)) # 是否直接攻击
+    objTriigerWayInfo = {} # 敌友已触发的列表,一般用于控制每人只触发一次的 {objID:{triggerWay:triggerCnt, ...}}
     for tagObj in tagObjListAll:
         tagID = tagObj.GetID()
         
@@ -1746,6 +1747,8 @@
                 
         # 连击
         if batType == ChConfig.TurnBattleType_Combo:
+            if not triggerOne:
+                TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_ComboOne, tagObj, connSkill=useSkill)
             TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Combo, tagObj, connSkill=useSkill)
             TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeCombo, curObj, connSkill=useSkill)
             if curMGObj and ChConfig.TriggerWay_Combo not in mgTriggerWayList:
@@ -1772,6 +1775,10 @@
                 if not lineupObj.IsAlive():
                     continue
                 
+                if lineupObjID not in objTriigerWayInfo:
+                    objTriigerWayInfo[lineupObjID] = {}
+                objTriigerWayCntDict = objTriigerWayInfo[lineupObjID]
+                
                 # 直接攻击
                 if isAttackDirect:
                     if not triggerOne:
@@ -1783,17 +1790,26 @@
                     if not triggerOne:
                         TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDotHurt, tagObj, connSkill=useSkill, byFriendObj=curObj)
                         
-                # 敌方被控时
+                # 敌方被控时 - 默认为友军造成的
                 if tagID in beControlledHardDict and lineupObj.GetFaction() != tagObj.GetFaction():
                     TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_EnemyBeControlledHard, tagObj, connSkill=useSkill)
-                    
+                    tagBuff = beControlledHardDict[tagID]
+                    # 敌方被冰冻
+                    if tagBuff.GetCurBuffState() == ChConfig.BatObjState_Frozen:
+                        if ChConfig.TriggerWay_FriendCausesFrozen not in objTriigerWayCntDict:
+                            objTriigerWayCntDict[ChConfig.TriggerWay_FriendCausesFrozen] = 1
+                            TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendCausesFrozen, tagObj, connSkill=useSkill)
+                            
                 # 连击
                 if batType == ChConfig.TurnBattleType_Combo:
                     TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendCombo, tagObj, connSkill=useSkill, byFriendObj=curObj)
-                    
+                    if isAttackDirect:
+                        TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendComboHurt, tagObj, connSkill=useSkill, byFriendObj=curObj)
                 # 追击
                 elif batType == ChConfig.TurnBattleType_Pursue:
                     TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendPursue, tagObj, connSkill=useSkill, byFriendObj=curObj)
+                    if isAttackDirect:
+                        TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendPursueHurt, tagObj, connSkill=useSkill, byFriendObj=curObj)
                     
         triggerOne = True # 设置已经触发过一次
         
@@ -2455,6 +2471,7 @@
     atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByBuffLayer, curSkill)
     atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByDeadTeammate, curSkill)
     atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByBuffState, curSkill)
+    atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByBeFrozenCnt, curSkill)
     return atkSkillPer
 
 def CanSuperHit(turnFight, atkObj, defObj, curSkill):

--
Gitblit v1.8.0