using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public enum BattleBuffType
{
None = 0,
Hurt = 1, //伤害
Enhance = 2, //增益
Negative = 3, //减益
Special = 4, //特殊
Heal = 5, //治疗
SpecialNegative = 6, //特殊减益
}
public enum BuffHitType
{
Perfect_Dodge = 1, //可完美闪避
Dodge = 2, //可普通闪避
Resist = 4, //可抵抗
Critical = 8, //可暴击
}
public enum Buff_Function_Type
{
Body_Size_Change_Value = 1, // 体型变大/体型变小
Phyx_Damage_Change_Percent = 2, // 物理伤害加成/减免百分比
Magic_Damage_Change_Percent = 3, // 魔法伤害加成/减免百分比
Fixed_Damage_Change_Value = 4, // 固定伤害数值
STR_Change_Percent = 10, // 降低/提升一定比例的STR
STR_Change_Value = 11, // 降低/提升一定数值的STR
INT_Change_Percent = 12, // 降低/提升一定比例的INT
INT_Change_Value = 13, // 降低/提升一定数值的INT
AGI_Change_Percent = 14, // 降低/提升一定比例的AGI
AGI_Change_Value = 15, // 降低/提升一定数值的AGI
Change_MaxHP_Percent = 16, // 降低/提升一定比例的HP
Change_MaxHP_Value = 17, // 降低/提升一定数值的HP
SP_Change_Percent = 18, // 造成以target来源属性为比例的回蓝
SP_Change_Value = 19, // 降低/提升一定数值的SP
Phyx_Defense_Change_Percent = 20, // 降低/提升一定比例的物防
Phyx_Defense_Change_Value = 21, // 降低/提升一定数值的物防
Magic_Defense_Change_Percent = 22, // 降低/提升一定比例的魔防
Magic_Defense_Change_Value = 23, // 降低/提升一定数值的魔防
Invincible = 24, // 无敌
Immunity = 25, // 免疫
Vertigo = 26, // 眩晕
Silence = 27, // 沉默
Forget = 28, // 遗忘
Confusion = 29, // 混乱
Fear = 30, // 恐惧
Frozen = 31, // 冰冻
Heal_Change_Percent = 32, // 治疗增幅/降幅百分比
Sleep = 33, // 睡眠
Stiff = 34, // 石化
Curse = 35, // 诅咒
Poison = 36, // 中毒
Break = 37, // 打断
Forbid_NormalSkill = 38, // 禁止普攻
Clean = 39, // 净化
Disperse = 40, // 驱散
Sneer = 41, // 嘲讽
Heal_Target_HP_Change_Percent = 42, // 治疗目标一定比例的HP
Heal_Target_HP_Change_Value = 43, // 治疗目标一定数值的HP
Summon_Monster = 44, // 召唤一定数量的怪物
Shield_AbsortAttack_Change_Percent = 45, // 一个数值为DEF%的吸收伤害护盾
ChangeHP_FromAttr_Percent = 46, //给目标加一个以来源数值为比例的治疗buff
Shield_AbsortAttack_Fixed_Change_Value = 47, // 一个固定值吸收伤害的护盾
LUK_Change_Value = 48, // 降低/提升固定值的LUK
LUK_Change_Percent = 49, // 降低/提升 一定比例的LUK
AttackCD_Change_Percent = 50, // 降低/提升 一定比例的攻击间隔
AttackCD_Change_Value = 51, // 降低/提升 固定值的间隔
Ten_Change_Percent = 52, // 降低/提升 一定比例的韧性
Ten_Change_Value = 53, // 降低/提升 固定值的韧性
Crit_Change_Percent = 54, // 降低/提升 暴击率百分比
Crit_Change_Value = 55, // 降低/提升 固定值的暴击率
RageStatus = 56, // 狂暴状态
Damage_Change_Percent = 57, // 伤害百分比
ChangeSkill = 58, // 替换技能
Attack_Change_Percent = 59, // 提升/降低 一定比例的物理攻击百分比
Attack_Change_Value = 60, // 提升/降低 一定数值的物理攻击力
MagicAttack_Change_Percent = 61, // 提升/降低 一定比例的魔防攻击百分比
MagicAttack_Change_Value = 62, // 提升/降低 一定数值的魔防攻击力
ChangeSkillSpeed = 63, // 加速/减速技能效果
Change_FromNature__Damage_Percent = 64, // 提升/降低 一定比例源于对应属性的伤害
Change_ToNature_Damage_Percent = 65, // 提升/降低 一定比例面向对应属性的伤害
AttackSpeed_Change_Percent = 66, // 提升/降低 一定比例的攻速百分比
Add_Function_Point_Value = 67, // 获得效果点数值
Deduct_Function_Point_Value = 68, // 扣除点数额外加成
ChangeBuff_Using_Function_Point = 69, // 拥有点数额外加成
Hit_Change_Percent = 70, // 降低/提升一定比例的命中
Hit_Change_Value = 71, // 降低/提升一定数值的命中
Dodge_Change_Percent = 72, // 降低/提升一定比例的闪避
Dodge_Change_Value = 73, // 降低/提升一定数值的闪避
Add_Hurt_From_Caster_Attr = 74, // 造成以自身来源属性为比例的伤害
Add_Hurt_From_Target_Attr = 75, // 造成以目标来源属性为比例的伤害
IgnorePhysicDefense_Change_Value = 76, // 提升/降低一定数值的忽视物防
IgnoreMagicDefense_Change_Value = 77, // 提升/降低一定数值的忽视魔防
Add_Duration_Hurt = 78, // 造成固定值的持续伤害
PhysicDamagePercent_Change_Value = 79, // 提升一定数值的物伤加成百分比
MagicDamagePercent_Change_Value = 80, // 提升一定数值的魔法伤害加成百分比
CritDamagePercent_Change_Value = 81, // 提升/降低一定数值的暴击伤害百分比
PhysicDamageReflectPercent_Change_Value = 82, // 提升/降低一定数值的物理伤害反射百分比
MagicDamageReflectPercent_Change_Value = 83, // 提升/降低一定数值的魔法伤害反射百分比
AntiPhysicDamagePercent_Change_Value = 84, // 提升/降低一定数值的抗物伤加成百分比
AntiMagicDamagePercent_Change_Value = 85, // 提升/降低一定数值的抗魔伤加成百分比
Hurt_Change_Value_From_Caster_STR = 86, // 造成以自身的力量为比例的持续伤害
Hurt_Change_Value_From_Caster_AGI = 87, // 造成以自身的敏捷为比例的持续伤害
Hurt_Change_Value_From_Caster_INT = 88, // 造成以自身的智力为比例的持续伤害
Hurt_Change_Value_From_Caster_VIT = 89, // 造成以自身的体质为比例的持续伤害
Hurt_Change_Value_From_Caster_DEX = 90, // 造成以自身的灵巧为比例的持续伤害
Hurt_Change_Value_From_Caster_LUK = 91, // 造成以自身的幸运为比例的持续伤害
Hurt_Change_Value_From_Caster_HP = 92, // 造成以自身的生命为比例的持续伤害
Hurt_Change_Value_From_Caster_SP = 93, // 造成以自身的蓝量为比例的持续伤害
Hurt_Change_Value_From_Caster_Attack = 94, // 造成以自身的物攻为比例的持续伤害
Hurt_Change_Value_From_Caster_MagicAttack = 95, // 造成以自身的魔攻为比例的持续伤害
Hurt_Change_Value_From_Caster_Defense = 96, // 造成以自身的物防为比例的持续伤害
Hurt_Change_Value_From_Caster_MagicDefense = 97, // 造成以自身的魔防为比例的持续伤害
Hurt_Change_Value_From_Caster_Hit = 98, // 造成以自身的命中为比例的持续伤害
Hurt_Change_Value_From_Caster_Dodge = 99, // 造成以自身的闪避为比例的持续伤害
Hurt_Change_Value_From_Caster_Crit = 100, // 造成以自身的暴击为比例的持续伤害
Hurt_Change_Value_From_Caster_Ten = 101, // 造成以自身的韧性为比例的持续伤害
Hurt_Change_Value_From_Caster_AttackSpeed = 102, //造成以自身的攻击速度为比例的持续伤害
Hurt_Change_Value_From_Caster_MaxHp = 103, // 造成以自身的最大血量为比例的持续伤害
Hurt_Change_Value_From_Caster_MaxSP = 104, // 造成以自身的最大蓝量为比例的持续伤害
Shield_AbsortAttack_Change_Percent_From_Caster = 105, //以caster属性来源为比例的护盾
Heal_Change_Percent_From_Caster = 106, //以caster属性来源为比例的治疗
Heal_Change_Percent_From_Target = 107, //以自身属性来源为比例的治疗
Add_SP_From_Caster = 109, //造成以caster来源属性为比例的回蓝
Hurt_Change_Value_From_Target_HP = 110, // 造成以目标的当前生命为比例的持续伤害
Hurt_Change_Value_From_Target_MaxHP = 111, // 造成以目标的当前生命为比例的持续伤害
PassiveSkill_Trigger = 112, // 被动技能触发效果
Nature_None_Change_Value = 113,
Nature_Water_Change_Value = 114,
Nature_Ground_Change_Value = 115,
Nature_Fire_Change_Value = 116,
Nature_Wind_Change_Value = 117,
Nature_Saint_Change_Value = 118,
Nature_Dark_Change_Value = 119,
Nature_Read_Change_Value = 120,
AntiNature_None_Change_Value = 121,
AntiNature_Water_Change_Value = 122,
AntiNature_Ground_Change_Value = 123,
AntiNature_Fire_Change_Value = 124,
AntiNature_Wind_Change_Value = 125,
AntiNature_Saint_Change_Value = 126,
AntiNature_Dark_Change_Value = 127,
AntiNature_Read_Change_Value = 128,
ChangeHP_From_CasterAttr_Percent = 129, //给caster加一个以来源数值为比例的治疗buff
//---------------------------------------------new
Hurt_Targert_SuckBlood = 130, //回复自身造成目标伤害的比例
Attack_Change_ByTargetAttr = 131, //根据目标属性 提升降低目标物理攻击
MagicAttack_Change_ByTargetAttr = 132, //根据目标属性 提升降低目标魔法攻击
AttackDefense_Change_ByTargetAttr = 133, //根据目标属性 提升降低目标物理防御
MagicDefense_Change_ByTargetAttr = 134, //根据目标属性 提升降低目标魔法防御
Attack_Change_BySourceAttr = 135, //根据施法者属性 提升降低目标物理攻击
MagicAttack_Change_BySourceAttr = 136, //根据施法者属性 提升降低目标魔法攻击
AttackDefense_Change_BySourceAttr = 137, //根据施法者属性 提升降低目标物理防御
MagicDefense_Change_BySourceAttr = 138, //根据施法者属性 提升降低目标魔法防御
Attack_Change_ByTargetCostHpPercent = 139, //根据目标损失血量比例 增加自身攻击
MagicAttack_Change_ByTargetCostHpPercent = 140, //根据目标损失血量比例 增加自身攻击
Attack_Change_BySourceCostHpPercent = 141, //根据施法者损失血量比例 增加自身攻击
MagicAttack_Change_BySourceCostHpPercent = 142, //根据施法者损失血量比例 增加自身攻击
Attack_Change_ByTargetCurHpPercent = 143, //根据目标血量比例 增加自身攻击
MagicAttack_Change_ByTargetCurHpPercent = 144, //根据目标血量比例 增加自身攻击
Attack_Change_BySourceCurHpPercent = 145, //根据施法者血量比例 增加自身攻击
MagicAttack_Change_BySourceCurHpPercent = 146, //根据施法者血量比例 增加自身攻击
Reflect_Hurt_ByTargetAttr = 150, //反弹自身受到傷害给 源伤害 更具目標屬性比例
Reflect_Hurt_BySourceAttr = 151, //反弹自身受到傷害给 源伤害 更具施法者屬性比例
Reflect_Fix_Hurt = 152, //自身受到伤害,反弹固定伤害
Hurt_Attack_SuckDamage = 153, //受到物理伤害吸收护盾
Hurt_MagicAttack_SuckDamage = 154, //受到魔法伤害吸收护盾
Change_Hit_Value = 155, //增加 降低 命中
Change_Doge_Value = 156, //增加 降低 闪避
Change_Crit_Value = 157, //增加 降低 暴击
Change_Ten_Value = 158, //增加 降低 抗暴
//tick
Target_Hurt_FixVal_ByTargetCostHp = 147, //根据目标损失血量 造成目标伤害
Target_Hurt_FixVal_BySourceCostHp = 148, //根据施法者损失血量 造成目标伤害
Target_Hurt_FixVal_BySourceTargetAttrDiff = 149, //根据目标与施法者属性差的比例伤害 造成目标伤害
//----------------------------------------------------------------------
Bullet_BeHurt_Change_Percent = 1000, // 子弹 伤害百分比
Bullet_BeHurt_Change_Value = 10001, // 子弹 伤害数值
}
///
/// 概率触发buff结构
///
public class TriggerBuffData
{
private int mBuffId;
private float mTriggerRatio;
private BuffTriggerType mTriggerType;
private BuffTriggerCasterType mCasterType;
private float mCD;
private float mLastTriggerTime = 0;
private int mCDFrame = 0;
private int mBuffLevel = 1;
//RunParam
private int mLastTriggerFrame = 0;
private int mTriggeredNum = 0;
private Fix64 mTriggerFrame = Fix64.Zero;
private Fix64 mCurFrame = Fix64.Zero;
public int BuffLevel
{
get { return mBuffLevel; }
set { mBuffLevel = value; }
}
public int BuffId
{
get { return mBuffId; }
}
public float TriggerRatio
{
get { return mTriggerRatio; }
}
public float CD
{
get { return mCD; }
}
public BuffTriggerType TriggerType
{
get { return mTriggerType; }
}
public BuffTriggerCasterType CasterType
{
get { return mCasterType; }
}
public float LastTriggerTime
{
get { return mLastTriggerTime; }
set { mLastTriggerTime = value; }
}
public int LastTriggerFrame
{
get { return mLastTriggerFrame; }
}
private int mCheckVal;
public int CheckVal
{
get { return mCheckVal; }
set { mCheckVal = value; }
}
private string mFunParamStr;
public string FunParamStr
{
get { return mFunParamStr; }
}
private int mExtendParam = 0;
public TriggerBuffData(int id,float ratio,float cd,BuffTriggerType type, BuffTriggerCasterType casterType,string extendParam,string funParam = null)
{
mBuffId = id;
mTriggerRatio = ratio;
mCD = cd;
mTriggerType = type;
mCasterType = casterType;
mCDFrame =(int) (mCD * Constants.frame_to_time);
mFunParamStr = funParam;
if (!string.IsNullOrEmpty(extendParam))
{
int.TryParse(extendParam, out mExtendParam);
if(type == BuffTriggerType.Trigger_FixedTime)
{
mTriggerFrame = (Fix64)mExtendParam * (Fix64)Constants.frame_to_time;
}
}
}
public bool CanTrigger(int frame)
{
if(mLastTriggerFrame != 0)
if (frame - mLastTriggerFrame < mCDFrame) return false;
return CanExcut();
}
public bool CanExcut()
{
float randomValue = BattleMgr.Instance.Battle.RandomValue(true);
return randomValue < mTriggerRatio;
}
public bool CanCheckCondition(Fighter fighter)
{
if(TriggerType == BuffTriggerType.Trigger_Negative_Fun)
{
return fighter.NegativeBuffCnt >= mExtendParam;
}
else if(TriggerType == BuffTriggerType.Trigger_HP_Lower)
{
bool IsTrigger = (SDouble)fighter.Life / fighter.MaxLife * 100 < mExtendParam;
return IsTrigger;
}else if(TriggerType == BuffTriggerType.Trigger_Accumulative_TakeDamage)
{
return fighter.TotalTakeDamage >= mExtendParam && mLastTriggerFrame == 0; //只能执行一次
}else if(TriggerType == BuffTriggerType.Trigger_Multi_Accumulative_TakeDamage)
{
return fighter.TotalTakeDamage >= (mExtendParam * (mTriggeredNum +1));
}
else if (TriggerType == BuffTriggerType.Trigger_Multi_Accumulative_TakeDamage_Precent)
{
int nMaxSetpHp = (int)(fighter.MaxLife * mExtendParam * 0.01f);
return fighter.TotalTakeDamage >= (nMaxSetpHp * (mTriggeredNum + 1));
}
else if (TriggerType == BuffTriggerType.Trigger_Accumulative_TakeDamage_Precent)
{
int nMaxSetpHp = (int)(fighter.MaxLife * mExtendParam * 0.01f);
return fighter.TotalTakeDamage >= nMaxSetpHp && mLastTriggerFrame == 0; //只能执行一次
}
return true;
}
public void DoTrigger(Fighter pFighter, int curFrame)
{
pFighter.CastBuff(null, BuffId, BuffLevel);
mLastTriggerFrame = curFrame;
mTriggeredNum++;
}
public void DoUpdateTrigger(Fighter pFighter, int curFrame)
{
if (TriggerType == BuffTriggerType.Trigger_FixedTime)
{
if(mCurFrame == mTriggerFrame)
{
if(CanExcut())
DoTrigger(pFighter, curFrame);
mCurFrame = Fix64.Zero;
return;
}
mCurFrame += 1;
}
}
public void ResetData()
{
mCurFrame = Fix64.Zero;
mLastTriggerFrame = 0;
mTriggeredNum = 0;
}
}
public class BuffFunctionData
{
public int id;
public BattleBuffType buffType;
public Buff_Function_Type functionType;
public bool canHurtStop; //是否可以伤害打断
public bool forbidMove; //是否影响动作
public bool forbidNormalAttack; //禁止普攻
public bool forbidSkill; //禁止技能释放
public bool canIgnoreDodge; //是否可以闪避
public float intervalTime; //间隔时长
public int[] fromAttr; //来源属性
public string icon; //图标
public int effectId; //特效id
public int endeffectId; //结束特效id
public string word; //文字
public string extendParam;
private int mTargetType = 0; //作用目标类型: 1 施法者, 2 目标
public int TargetType
{
get { return mTargetType; }
set { mTargetType = value; }
}
private int mGroup = 0;
public int Group
{
get { return mGroup; }
}
private float mVal;
private float mDuration;
private float mIncVal;
private float mIncDur;
private int mSkillLv = 1;
public int SkillLv
{
get { return mSkillLv; }
}
//是否为瞬发效果
public bool IsInstantFunc
{
get { return duration <= 0; }
}
public float IncVal
{
get { return mIncVal; }
}
public float value
{
get
{
return mVal + (mSkillLv - 1) * mIncVal;
}
}
public float duration
{
get
{
return mDuration + (mSkillLv - 1) * mIncDur;
}
}
public float BaseValue
{
get { return mVal; }
}
public float BaseDuration
{
get { return mDuration; }
}
public BuffFunctionData(int id, float val, float incVal, float duration, float incDur, int[] fromAttr, float intervalTime,string extendParam)
{
Dictionary dic = ConfigMgr.Instance.getLine(id, Config.FunctionCfgName);
if (dic == null) return;
this.id = id;
this.mVal = val;
this.mIncVal = incVal;
this.mDuration = duration;
this.mIncDur = incDur;
this.fromAttr = fromAttr;
this.intervalTime = intervalTime;
this.extendParam = extendParam;
int temp;
if (dic.ContainsKey("FunctionType"))
{
int.TryParse(dic["FunctionType"], out temp);
functionType = (Buff_Function_Type)temp;
}
if(dic.ContainsKey("BuffType"))
{
int.TryParse(dic["BuffType"], out temp);
this.buffType = (BattleBuffType)temp;
}
if(dic.ContainsKey("HurtStop"))
{
int.TryParse(dic["HurtStop"], out temp);
this.canHurtStop = temp > 0;
}
if(dic.ContainsKey("ForbidMove"))
{
int.TryParse(dic["ForbidMove"], out temp);
this.forbidMove = temp > 0;
}
if(dic.ContainsKey("ForbidAttack"))
{
int.TryParse(dic["ForbidAttack"], out temp);
this.forbidNormalAttack = temp > 0;
}
if(dic.ContainsKey("ForbidSkill"))
{
int.TryParse(dic["ForbidSkill"], out temp);
this.forbidSkill = temp > 0;
}
if(dic.ContainsKey("Dodge"))
{
int.TryParse(dic["Dodge"], out temp);
this.canIgnoreDodge = temp > 0;
}
if(dic.ContainsKey("Icon"))
{
icon = dic["Icon"];
}
if(dic.ContainsKey("Effect"))
{
int.TryParse(dic["Effect"], out effectId);
}
if (dic.ContainsKey("EndEffect"))
{
int.TryParse(dic["EndEffect"], out endeffectId);
}
if (dic.ContainsKey("Word"))
{
word = dic["Word"];
}
if(dic.ContainsKey("Group"))
{
int.TryParse(dic["Group"], out mGroup);
}
}
public void SetLevel(int skillLevel)
{
mSkillLv = skillLevel;
}
public void Dispose()
{
}
}
public class TriggerMarkParam
{
public int markId;
public int markVal;
public int markTargetType;
public TriggerMarkParam(int id, int val, int targetType)
{
this.markId = id;
this.markVal = val;
this.markTargetType = targetType;
}
}
public struct TargetFilterRule
{
public FilterTeamType teamType;
public FilterActorType actorType;
public FilterParamType paramType;
public int paramVal;
public int extendParam1;
public int extendParam2;
public TargetFilterRule(int teamType,int actorType, int paramType,int paramVal,int extendParam1,int extendParam2)
{
this.teamType = (FilterTeamType)teamType;
this.actorType = (FilterActorType)actorType;
this.paramType = (FilterParamType)paramType;
this.paramVal = paramVal;
this.extendParam1 = extendParam1;
this.extendParam2 = extendParam2;
}
public TargetFilterRule(int teamType,int actorType)
{
this.teamType = (FilterTeamType)teamType;
this.actorType = (FilterActorType)actorType;
this.paramType = FilterParamType.Param_Type_None;
this.paramVal = 0;
this.extendParam1 = 0;
this.extendParam2 = 0;
}
public TargetFilterRule(int teamType,int actorType,int paramType,int paramVal)
{
this.teamType = (FilterTeamType)teamType;
this.actorType = (FilterActorType)actorType;
this.paramType = (FilterParamType)paramType;
this.paramVal = paramVal;
this.extendParam1 = 0;
this.extendParam2 = 0;
}
}
public class BuffData
{
public int buffID;
public string buffDescription;
public string icon;
public int totalFrame;
public Target_Select_Rule funTargetType;
public TargetFilterRule filterRule;
public float rate;
public int sortValue;
public int hitType;
public Damage_Type damageType; //伤害类型
public bool ignoreMultiHurt; //是否忽略多段伤害
public float multiHurtIntervalTime;
public int multiHurtCnt;
public string extendFunStr;
public List extendBuffs = null;
public bool removeFunAfterStop = false;
public int cloneBossId = 0;
public TriggerMarkParam markData = null;
public List markExtendList = null;
protected SkillActionFrameEvent[] mBuffActionFrameEvents;
private List mBuffFunList = new List();
public List BuffFunList
{
get { return mBuffFunList; }
}
public SkillActionFrameEvent[] ActionFrameEvents
{
get { return mBuffActionFrameEvents; }
}
public SkillActionFrameEvent SingFrameEvent = null;
public BuffData(int id, int gender, ProfessionType jobType, int jobStage, int jobBranch)
{
Dictionary dic = ConfigMgr.Instance.getLine(id, Config.BuffCfgName);
if (dic == null)
{
DebugHelper.LogWarning(string.Format("{0} buff 在buff配表中不存在", id));
mBuffActionFrameEvents = new SkillActionFrameEvent[0];
return;
}
this.buffID = id;
if(dic.ContainsKey("Desc"))
{
buffDescription = dic["Desc"];
}
if(dic.ContainsKey("Icon"))
{
icon = dic["Icon"];
}
int temp;
if (dic.ContainsKey("TargetType"))
{
int.TryParse(dic["TargetType"], out temp);
funTargetType = (Target_Select_Rule)temp;
}
if(dic.ContainsKey("FilterType"))
{
string filterTypeStr = dic["FilterType"];
if(!string.IsNullOrEmpty(filterTypeStr))
{
int[] iVals = StringUtil.split2Int(filterTypeStr, ';');
if(iVals.Length == 2)
{
filterRule = new TargetFilterRule(iVals[0], iVals[1]);
}else if(iVals.Length == 4)
{
filterRule = new TargetFilterRule(iVals[0], iVals[1], iVals[2], iVals[3]);
}else if(iVals.Length == 6)
{
filterRule = new TargetFilterRule(iVals[0], iVals[1], iVals[2], iVals[4], iVals[5], iVals[6]);
}
}
}
if (dic.ContainsKey("HitType"))
{
int.TryParse(dic["HitType"], out hitType);
}
if (dic.ContainsKey("Effectiveness"))
{
float.TryParse(dic["Effectiveness"], out rate);
rate = rate / 10000.0f;
}
if(dic.ContainsKey("DamageType"))
{
int.TryParse(dic["DamageType"], out temp);
damageType = (Damage_Type)temp;
}
if(dic.ContainsKey("IgnoreMultiHurt"))
{
int.TryParse(dic["IgnoreMultiHurt"], out temp);
ignoreMultiHurt = temp > 0;
}
if (dic.ContainsKey("Function"))
{
SetFunData(dic["Function"]);
}
if(dic.ContainsKey("ExtendFunction"))
{
extendFunStr = dic["ExtendFunction"];
}
if (dic.ContainsKey("RemoveFunWhenStop"))
{
int.TryParse(dic["RemoveFunWhenStop"], out temp);
removeFunAfterStop = temp > 0;
}
if(!string.IsNullOrEmpty(extendFunStr))
{
extendBuffs = new List();
string[] extendFunList = StringUtil.split(extendFunStr, ';');
for (int idx = 0; idx < extendFunList.Length; idx++)
{
int[] funVals = StringUtil.split2Int(extendFunList[idx], ':');
if(funVals.Length >= 2)
{
ValType valType = new ValType(funVals[1], funVals[0]);
extendBuffs.Add(valType);
}
}
}
if(dic.ContainsKey("Mark"))
{
var tempStr = dic["Mark"];
if(!string.IsNullOrEmpty(tempStr))
{
string[] tempStrList = tempStr.Split(':');
if(tempStrList.Length == 3)
{
int markId, val, targetType;
int.TryParse(tempStrList[0], out markId);
int.TryParse(tempStrList[1], out val);
int.TryParse(tempStrList[2], out targetType);
if(markId > 0)
markData = new TriggerMarkParam(markId,val,targetType);
}
}
}
if(markData!=null)
{
if(dic.ContainsKey("MarkExtend"))
{
var tempStr = dic["MarkExtend"];
if (!string.IsNullOrEmpty(tempStr))
{
markExtendList = new List();
string[] tempStrList = tempStr.Split(';');
for(int idx =0; idx < tempStrList.Length;idx++)
{
var str = tempStrList[idx];
string[] tempStrList2 = str.Split(':');
if(tempStrList2.Length == 2)
{
int layer = 0, buffId = 0;
int.TryParse(tempStrList2[0], out layer);
int.TryParse(tempStrList2[1], out buffId);
ValType val = new ValType(layer, buffId);
markExtendList.Add(val);
}
}
}
}
}
LoadEventsData(gender,(int)jobType,jobStage,jobBranch);
}
public void SetFunData(string funStr)
{
if (string.IsNullOrEmpty(funStr)) return;
string[] funStrList = funStr.Split(';');
mBuffFunList = new List(funStrList.Length);
for (int idx = 0; idx < funStrList.Length; idx++)
{
string[] funTemp = funStrList[idx].Split(':');
if (funTemp.Length < 2) continue;
int funId = 0;
float funVal = 0;
float funIncVal = 0;
float funDuration = 0;
float funIncDuration = 0;
int[] fromAttr = new int[1];
fromAttr[0] = 0;
float intervalTime = 0;
int targetType = 0;
string extendParam = null;
if (funTemp.Length > 1)
{
float[] funValList = StringUtil.split2Float(funTemp[1], '_');
if (funValList.Length > 0)
funVal = funValList[0];
if (funValList.Length > 1)
funIncVal = funValList[1];
}
if (funTemp.Length > 2)
{
float[] funDurList = StringUtil.split2Float(funTemp[2], '_');
if (funDurList.Length > 0)
funDuration = funDurList[0];
if (funDurList.Length > 1)
funIncDuration = funDurList[1];
}
if (funTemp.Length > 3)
{
fromAttr = StringUtil.split2Int(funTemp[3], '_');
}
if (funTemp.Length > 4)
{
float.TryParse(funTemp[4], out intervalTime);
}
if (funTemp.Length > 5)
{
int.TryParse(funTemp[5], out targetType);
}
if (funTemp.Length > 6)
{
extendParam = funTemp[6];
}
if (int.TryParse(funTemp[0], out funId))
{
BuffFunctionData fun = new BuffFunctionData(funId, funVal, funIncVal, funDuration, funIncDuration, fromAttr, intervalTime, extendParam);
fun.TargetType = targetType;
BuffFunList.Add(fun);
}
}
}
void LoadEventsData(int gender, int jobType, int jobStage, int jobBranch)
{
bool calc = false;
SkillActionFrameEvent hitFE = null;
try
{
ActionEventData aeData = SkillActionEventCfgMgr.Instance.GetActionEventData(buffID,gender,jobType,jobStage,jobBranch);
if (aeData == null)
{
DebugHelper.LogError("LoadEventsData:中没有buffID = " + buffID);
mBuffActionFrameEvents = new SkillActionFrameEvent[0];
return;
}
totalFrame = aeData.TotalFrame;
//totalTime = aeData.TotalFrame / Constants.frame_to_time;
List aeParams = aeData.ActionEventList;
if (aeParams == null || aeParams.Count == 0) return;
List eventList = new List(aeParams.Count);
for (int idx = 0; idx < aeParams.Count; idx++)
{
ActionEventParam aep = aeParams[idx];
SkillActionFrameEvent frameEventData = new SkillActionFrameEvent(this.buffID);
frameEventData.initStartTime = (Fix64)aep.startFrame / (Fix64)Constants.frame_to_time;
frameEventData.initEndTime = (Fix64)aep.endFrame / (Fix64)Constants.frame_to_time;
frameEventData.initStartFrame = aep.startFrame;
frameEventData.initEndFrame = aep.endFrame;
frameEventData.bAffectBySing = aep.bAffectBySing;
frameEventData.eventType = (SkillActionFrameEventType)aep.eventType;
frameEventData.name = frameEventData.initStartFrame.ToString() + "," + ((int)frameEventData.eventType).ToString();
frameEventData.paramerters = aep.frameParams.ToArray();
eventList.Add(frameEventData);
if (frameEventData.eventType == SkillActionFrameEventType.FE_Skill_Sing)
{
SingFrameEvent = frameEventData;
}
if(frameEventData.eventType == SkillActionFrameEventType.FE_Hit ||
frameEventData.eventType == SkillActionFrameEventType.FE_Bullet)
{
if (hitFE != null && !calc)
{
multiHurtIntervalTime = (frameEventData.initStartFrame - hitFE.initStartFrame) / Constants.frame_to_time;
calc = true;
}
else
{
hitFE = frameEventData;
}
multiHurtCnt++;
}
}
CommonUtil.SortList(eventList, (a, b) => (int)(a.startTime * Constants.frame_to_time) - (int)(b.startTime * Constants.frame_to_time));
mBuffActionFrameEvents = eventList.ToArray();
}
catch (System.Exception e)
{
DebugHelper.LogError("加载buff {0} 的动作帧事件失败:{1}", buffID, e.Message);
mBuffActionFrameEvents = new SkillActionFrameEvent[0];
}
}
private int mBuffLevel = 1;
public int BuffLevel
{
get { return mBuffLevel; }
}
public void SetLevel(int skillLv)
{
mBuffLevel = skillLv;
if (BuffFunList == null) return;
for(int idx =0; idx < BuffFunList.Count;idx++)
{
BuffFunctionData funData = BuffFunList[idx];
funData.SetLevel(skillLv);
}
}
public void Dispose()
{
//清理buff的帧事件数据
if (mBuffActionFrameEvents != null)
{
for (int i = 0; i < mBuffActionFrameEvents.Length; ++i)
{
if (mBuffActionFrameEvents[i] != null)
{
mBuffActionFrameEvents[i].Dispose();
mBuffActionFrameEvents[i] = null;
}
}
mBuffActionFrameEvents = null;
}
}
}