public void CastSk(params Object[] args) { if (castor != null && param != null) { WarSrcAnimParam srcParam = param as WarSrcAnimParam; if (srcParam != null) { SelfDescribed sd = srcParam.described; if (sd != null) { EndResult result = sd.targetEnd; if (result != null) { WarServerManager mgr = WarServerManager.Instance; int target = result.param3; ServerNPC npc = mgr.npcMgr.GetNPCByUniqueID(target); if (npc != null) { Vector3 dir = npc.transform.position; dir.y = castor.transform.position.y; dir = dir - castor.transform.position; Quaternion rot = Quaternion.LookRotation(dir, Vector3.up); castor.transform.rotation = rot; LeanTween.cancel(castor.gameObject); LeanTween.move(castor.gameObject, npc.transform.position, 0.2f); castor.SendNpcMoveMsg(true); } } } } } }
/// <summary> /// 释放技能效果 /// </summary> /// <param name="src">效果发起者</param> /// <param name="target">目标参数无效</param> /// <param name="skDirectHurt">是否是技能的直接伤害, 这个没有伤害</param> /// <param name="container">所有数据展现的容器,本次Effect施法的效果会依次加入</param> /// <param name="skTarget">Sk target.</param> public void Cast(ServerNPC src, IEnumerable <ServerNPC> skTarget, IEnumerable <ServerNPC> target, bool skDirectHurt, List <MsgParam> container) { #if DEBUG Utils.Assert(skCfg == null, "Skill Configure is null in BulletNpcEffect routine."); #endif WarSrcAnimParam SrcParam = new WarSrcAnimParam() { OP = EffectOp.Bullet_NPC, ShootAction = skCfg.ShootAction, ShootTime = skCfg.ShootTime, ShootEventTime = skCfg.ShootEventTime, }; /// /// 有延迟的伤害类技能,伤害的结算都推后 /// SelfDescribed des = new SelfDescribed() { src = src.UniqueID, target = src.UniqueID, act = Verb.Creature, srcEnd = null, targetEnd = new EndResult() { param1 = src.UniqueID, param2 = cfg.ID, param3 = cfg.Param1, } }; SrcParam.described = des; container.Add(SrcParam); }
public void Init(ServerNPC parent, WarMsgParam param) { owner = parent; wmMgr = WarServerManager.Instance; tran = transform; if (param is WarSrcAnimParam) { WarSrcAnimParam wp = param as WarSrcAnimParam; sphereParam = wp; WarTarAnimParam[] tars = wp.InjureTar; speed = wp.described.targetEnd.param8; maxDis = wp.described.targetEnd.param9; if (tars != null && tars.Length > 0) { SelfDescribed sd = tars[0].described; npcId = sd.targetEnd.param5; if (wmMgr != null) { target = wmMgr.npcMgr.GetNPCByUniqueID(npcId); if (target != null && parent.outLog) { Debug.Log("Sphere target : " + target.name); } } } else { target = null; } } inited = true; }
public virtual void Awake() { BuffList = new List <int>(); TriggerList = new List <int>(); hatredList = new Dictionary <int, Hatredd>(); childNpc = new List <ServerNPC>(); animParam = new WarSrcAnimParam(); }
/// <summary> /// 释放技能效果 /// </summary> /// <param name="src">效果发起者</param> /// <param name="skTarget">技能选择的目标, 技能目标忽略</param> /// <param name="target">技能先选择目标后,再次Effect选择后的目标,忽略</param> /// <param name="skDirectHurt">是否是技能的直接伤害, 这个没有伤害</param> /// <param name="container">所有数据展现的容器,本次Effect施法的效果会依次加入</param> public void Cast(ServerNPC src, IEnumerable <ServerNPC> skTarget, IEnumerable <ServerNPC> target, bool skDirectHurt, List <MsgParam> container) { //获取本地的EffectAttribute var efType = GetType(); var classAttribute = (EffectAttribute)Attribute.GetCustomAttribute(efType, typeof(EffectAttribute)); WarSrcAnimParam param = new WarSrcAnimParam(); param.OP = classAttribute.OP; param.ShootAction = skCfg.ShootAction; param.ShootTime = skCfg.ShootTime; param.ShootEventTime = skCfg.ShootEventTime; /// 将自己位移到符合<param1>条件的子物体位置,原有子物体是否存在由<param2>决定 MvToChildCon con = (MvToChildCon)Enum.ToObject(typeof(MvToChildCon), cfg.Param1); MvToChildAlive alive = (MvToChildAlive)Enum.ToObject(typeof(MvToChildAlive), cfg.Param2); IEnumerable <ServerNPC> reTargets = select(src, ((ServerNPC)src).getChildNpc, con); if (reTargets.Any()) { ServerNPC final = reTargets.First(); if (final != null) { UVec3 pos = final.transform.position; SelfDescribed desc = new SelfDescribed() { src = src.UniqueID, target = src.UniqueID, act = Verb.Blink, srcEnd = new EndResult() { param1 = (int)alive, param2 = final.UniqueID, param8 = pos.x, param9 = pos.y, param10 = pos.z, }, targetEnd = null, }; param.described = desc; } } container.Add(param); }
public override void Init(ServerNPC owner, WarMsgParam param) { parent = owner; ConsoleEx.DebugLog(parent.name); wmMgr = WarServerManager.Instance; UniqueId = wmMgr.npcMgr.SignID(this); Camp = Camp.set(owner.Camp); WarSrcAnimParam wp = param as WarSrcAnimParam; if (wp != null) { SelfDescribed sd = wp.described; EndResult result = sd.srcEnd; lifeTime = result.param8; } inited = true; }
public override void OnHandleMessage(MsgParam param) { base.OnHandleMessage(param); if (param is WarTarAnimParam) { WarTarAnimParam effParam = param as WarTarAnimParam; switch (effParam.OP) { case EffectOp.Injury: BeInjured(effParam); break; case EffectOp.Treat: BeTreated(effParam); break; case EffectOp.ExchangeNpcAttri: break; } } else if (param is WarSrcAnimParam) { WarSrcAnimParam src = param as WarSrcAnimParam; if (src.OP == EffectOp.ExchangeNpcAttri) { Debug.Log("换血了"); } } else if (param is WarMsgParam) { WarMsgParam warParam = param as WarMsgParam; switch (warParam.cmdType) { case WarMsg_Type.Win: case WarMsg_Type.Lose: BattleOver(); break; } } }
public void MoveStop(string MoveStopInfo) { AsyncTask.QueueOnMainThread( () => { WarServerManager mgr = WarServerManager.Instance; if (mgr != null) { NpcAnimInfo info = JSON.Instance.ToObject <NpcAnimInfo>(MoveStopInfo); ServerLifeNpc npc = monitor.CharactorPool.findActionNpc(info.ui); WarSrcAnimParam param = new WarSrcAnimParam(); param.cmdType = WarMsg_Type.Stand; param.param = MoveStopInfo; mgr.npcMgr.SendMessageAsync(npc.UniqueID, npc.UniqueID, param); } } ); processedMsg = new NetMQMessage(); processedMsg.Append(WarMsgConsts.MoveStopRep); }
public void CastSk(params Object[] args) { if (castor != null && param != null) { WarSrcAnimParam srcParam = param as WarSrcAnimParam; if (srcParam != null) { SelfDescribed sd = srcParam.described; if (sd != null) { EndResult result = sd.srcEnd; // float x = result.param8; // float z = result.param9; Vector3 pos = Vector3.zero; // castor.transform.position = pos; // castor.SendNpcMoveMsg(true); if (castor is ServerLifeNpc) { ServerLifeNpc sCastor = castor as ServerLifeNpc; sCastor.HitAnimReset(); } int clearFlag = result.param1; if (clearFlag == 0) { ServerNPC npc = castor.getOneChildNpc(result.param2); if (npc != null) { pos = npc.transform.position; pos.y = 0.1f; castor.transform.position = pos; castor.SendNpcMoveMsg(true); castor.removeChild(npc); WarServerManager mgr = WarServerManager.Instance; IpcDestroyNpcMsg msg = new IpcDestroyNpcMsg(); msg.id = npc.UniqueID; mgr.realServer.proxyCli.NpcDestroy(msg); UnityEngine.GameObject.Destroy(npc.gameObject); } } } } } }
/// <summary> /// 释放技能效果 /// </summary> /// <param name="src">效果发起者</param> /// <param name="skTarget">技能选择的目标,本参数在这里无意义</param> /// <param name="target">技能先选择目标后,再次Effect选择后的目标。本参数数量 >= 0 </param></param> /// <param name="skDirectHurt">是否是技能的直接伤害, 这个没有伤害</param> /// <param name="container">所有数据展现的容器,本次Effect施法的效果会依次加入</param> public void Cast(ServerNPC src, IEnumerable <ServerNPC> skTarget, IEnumerable <ServerNPC> target, bool skDirectHurt, List <MsgParam> container) { #if DEBUG Utils.Assert(cfg == null, "Effect configure is null in DotHotEffect."); Utils.Assert(skCfg == null, "skill configure is null in DotHotEffect."); #endif foreach (ServerNPC bnpc in target) { WarTarAnimParam param = new WarTarAnimParam() { OP = EffectOp.DotHot, HitAction = cfg.HitAction, }; BuffMgr bufMgr = WarServerManager.Instance.bufMgr; BuffCtorParamEx ctor = new BuffCtorParamEx() { fromNpcId = src.UniqueID, toNpcId = bnpc.UniqueID, cfg = base.cfg, }; //创建BUff RtBufData maybe = bufMgr.createBuff(ctor); //statistics SelfDescribed des = statistics(maybe, src, bnpc); param.described = des; container.Add(param); } //通知给技能释放者的目标 WarSrcAnimParam SrcParam = new WarSrcAnimParam() { OP = EffectOp.DotHot, ShootAction = skCfg.ShootAction, ShootTime = skCfg.ShootTime, ShootEventTime = skCfg.ShootEventTime, described = toSelf(src.UniqueID), }; container.Add(SrcParam); }
/// <summary> /// 释放技能效果 /// </summary> /// <param name="src">效果发起者</param> /// <param name="target">目标参数无效</param> /// <param name="skDirectHurt">是否是技能的直接伤害, 这个没有伤害</param> /// <param name="container">所有数据展现的容器,本次Effect施法的效果会依次加入</param> /// <param name="skTarget">Sk target.</param> public void Cast(ServerNPC src, IEnumerable <ServerNPC> skTarget, IEnumerable <ServerNPC> target, bool skDirectHurt, List <MsgParam> container) { #if DEBUG Utils.Assert(skCfg == null, "Skill Configure is null in BulletNpcEffect routine."); #endif int finalTarget = 0; HookNpcDisappearType disappearType = (HookNpcDisappearType)Enum.ToObject(typeof(HookNpcDisappearType), cfg.Param2); if (disappearType == HookNpcDisappearType.DisWhenFinalTar) { Utils.Assert(target.Count() != 1, "HookNpcEffect is DisWhenFinalTar type, so only one target is allowed."); finalTarget = target.First().UniqueID; } WarSrcAnimParam SrcParam = new WarSrcAnimParam() { OP = EffectOp.Bullet_NPC, ShootAction = skCfg.ShootAction, ShootTime = skCfg.ShootTime, SkillId = skCfg.ID, ShootEventTime = skCfg.ShootEventTime, }; SelfDescribed des = new SelfDescribed() { src = src.UniqueID, target = src.UniqueID, act = Verb.Creature, srcEnd = null, targetEnd = new EndResult() { param1 = src.UniqueID, param2 = cfg.ID, param3 = finalTarget, } }; SrcParam.described = des; container.Add(SrcParam); }
/// <summary> /// 释放技能效果 /// </summary> /// <param name="src">效果发起者</param> /// <param name="skTarget">技能选择的目标</param> /// <param name="target">技能先选择目标后,再次Effect选择后的目标</param> /// <param name="skDirectHurt">是否是技能的直接伤害</param> /// <param name="container">所有数据展现的容器,本次Effect施法的效果会依次加入</param> public void Cast(ServerNPC src, IEnumerable <ServerNPC> skTarget, IEnumerable <ServerNPC> target, bool skDirectHurt, List <MsgParam> container) { #if DEBUG Utils.Assert(cfg == null, "Effect Configure is null in SwitchNpcEffect."); #endif //有且只有一个 //Utils.Assert(target.Count() != 1, "HookNpcEffect is DisWhenFinalTar type, so only one target is allowed."); int targetId = 0; if (target != null && target.Count() > 0) { targetId = target.First().UniqueID; } WarSrcAnimParam SrcParam = new WarSrcAnimParam() { OP = EffectOp.MoveTarget, ShootAction = skCfg.ShootAction, ShootTime = skCfg.ShootTime, ShootEventTime = skCfg.ShootEventTime, SkillId = skCfg.ID, }; SelfDescribed des = new SelfDescribed() { src = src.UniqueID, target = src.UniqueID, act = Verb.Move, srcEnd = null, targetEnd = new EndResult() { param1 = cfg.ID, param2 = src.UniqueID, param3 = targetId, } }; SrcParam.described = des; container.Add(SrcParam); }
public virtual void Skill_Handle() { if (STATE == NpcAnimState.CastSkill) { animationTimer -= Time.deltaTime; animationEventTimer -= Time.deltaTime; if (animationEventTimer <= 0f && canTriggerEvent) { canTriggerEvent = false; WarSrcAnimParam srcParam = skParam as WarSrcAnimParam; int index = srcParam.arg1; List <ISkImp> ops = null; ISkImp sk = null; if (!sk_Imps.TryGetValue(index, out ops)) { ops = new List <ISkImp>(); sk_Imps.Add(index, ops); } sk = ops.Find(imp => imp.SkOp() == srcParam.OP); if (sk == null) { sk = SkImpFactory.getSkImp(srcParam.OP); ops.Add(sk); } sk.Reset(); sk.InitSk(cachedNpc, srcParam); sk.CastSk(); } if (animationTimer < 0f) { isCastSkill = false; canNextAnim = true; cachedNpc.HitAnimReset(); cachedNpc.curStatus = cachedNpc.curStatus.clear(NpcStatus.InSkill); On_Stand(null); } } }
/// <summary> /// Init the specified owner and param. /// </summary> /// <param name="owner">Owner.</param> /// <param name="param">Parameter.</param> public override void Init(ServerNPC owner, WarMsgParam param) { parent = owner; tran = transform; wmMgr = WarServerManager.Instance; Camp = Camp.set(parent.Camp); WarSrcAnimParam srcParam = param as WarSrcAnimParam; if (srcParam != null) { SelfDescribed sd = srcParam.described; if (sd != null) { EndResult result = sd.targetEnd; int effectIndex = result.param2; targetIndex = result.param5; if (targetIndex > 0) { if (wmMgr != null) { target = wmMgr.npcMgr.GetNPCByUniqueID(targetIndex); } } EffectConfigData effect = Core.Data.getIModelConfig <EffectModel>().get(effectIndex); if (effect != null) { effectID = effectIndex; speed = effect.Param3 / 1000f; maxDis = effect.Param4 / 1000; damageType = effect.Param8; disappearType = effect.Param5; } // string msg = string.Format("[effect:{0} speed:{1} maxDis:{2} disappearType:{3} damageType:{4}]", effectID, speed, maxDis, disappearType, damageType); // Debug.Log(msg); } inited = true; } }
public void CastSk(params Object[] args) { if (castor != null && param != null) { WarSrcAnimParam srcParam = param as WarSrcAnimParam; if (srcParam != null) { WarTarAnimParam[] targets = srcParam.InjureTar; if (targets != null && targets.Length > 0) { WarServerManager mgr = WarServerManager.Instance; for (int i = 0; i < targets.Length; i++) { if (targets[i] != null) { mgr.npcMgr.SendMessageAsync(castor.UniqueID, targets[i].described.target, targets[i]); } } } } } }
public void CastSk(params Object[] args) { if (castor != null && param != null) { WarSrcAnimParam srcParam = param as WarSrcAnimParam; if (srcParam != null) { SelfDescribed sd = srcParam.described; if (sd != null) { EndResult result = sd.targetEnd; if (result != null) { int modelId = result.param3; VirtualNpcLoader loader = Core.ResEng.getLoader <VirtualNpcLoader>(); Transform tran = castor.transform; Vector3 pos = tran.position + tran.rotation * Vector3.forward; pos.y = 0.1f; GameObject obj = loader.LoadBulletNpc(modelId, castor.Camp, pos, tran.rotation); Physics.IgnoreCollision(castor.collider, obj.collider); if (obj != null) { ServerBulletNpc npc = obj.GetComponent <ServerBulletNpc>(); { SendCrtBulletMsg(npc); castor.addChildNpc(npc); npc.Init(castor, param); } } } } } } }
/// <summary> /// 释放技能效果 /// </summary> /// <param name="src">效果发起者</param> /// <param name="skTarget">技能选择的目标</param> /// <param name="target">技能先选择目标后,再次Effect选择后的目标</param> /// <param name="skDirectHurt">是否是技能的直接伤害</param> /// <param name="container">所有数据展现的容器,本次Effect施法的效果会依次加入</param> public void Cast(ServerNPC src, IEnumerable <ServerNPC> skTarget, IEnumerable <ServerNPC> target, bool skDirectHurt, List <MsgParam> container) { #if DEBUG Utils.Assert(cfg == null, "Effect Configure is null in SwitchNpcEffect."); #endif int SwitchToId = cfg.Param1; UVec3 Locale = src.transform.position; NPCAIType AI = (NPCAIType)Enum.ToObject(typeof(NPCAIType), cfg.Param2); //数据源 CtorNpcSource datasrc = (CtorNpcSource)Enum.ToObject(typeof(CtorNpcSource), cfg.Param3); int chargeOf = cfg.Param4; float duration = cfg.Param5 * Consts.OneThousand; //参数10,是否继承普通攻击 bool inheritNorAtk = cfg.Param10 == 0; NPCConfigData npcCfg = null; NPCRuntimeData npcRt = null; //获取参数配置 NPCModel model = Core.Data.getIModelConfig <NPCModel>(); switch (datasrc) { case CtorNpcSource.NPC_Castor_Init: npcCfg = src.data.configData.ShallowCopy(); break; case CtorNpcSource.NPC_Castro_Cur: npcCfg = src.data.configData.ShallowCopy(); npcRt = src.data.rtData.ShallowCopy(); break; case CtorNpcSource.NPC_Table: npcCfg = model.get(SwitchToId); Utils.Assert(npcCfg == null, "Can't find NPC configure. NPC ID = " + SwitchToId); break; } if (inheritNorAtk == false) { NPCConfigData swtNpcCfg = model.get(SwitchToId); Utils.Assert(swtNpcCfg == null, "Can't find NPC configure. NPC ID = " + SwitchToId); npcCfg.ID = SwitchToId; npcCfg.normalHit = swtNpcCfg.normalHit; } npcRt = npcRt ?? new NPCRuntimeData(npcCfg); //额外的属性修改 NPCAttributeModel AttModel = Core.Data.getIModelConfig <NPCAttributeModel>(); AttrbuteConfig att1 = AttModel.get(cfg.Param6); AttrbuteConfig att2 = AttModel.get(cfg.Param8); //参数 float param1 = cfg.Param7 * Consts.OneThousand; float param2 = cfg.Param9 * Consts.OneThousand; //修正属性的值 if (att1 != null) { if (att1.type == "int") { npcRt.addIntegerValue(att1.note, param1); } else if (att1.type == "float") { npcRt.addFloatValue(att1.note, param1); } } if (att2 != null) { if (att2.type == "int") { npcRt.addIntegerValue(att2.note, param2); } else if (att2.type == "float") { npcRt.addFloatValue(att2.note, param2); } } //Buff的列表 int[] BuffIds = cfg.Param11; /// /// 统计信息 /// WarSrcAnimParam SrcParam = new WarSrcAnimParam() { OP = EffectOp.SwitchNpc, ShootAction = skCfg.ShootAction, ShootEventTime = skCfg.ShootEventTime, ShootTime = skCfg.ShootTime, described = new SelfDescribed() { src = src.UniqueID, target = src.UniqueID, act = Verb.Creature, srcEnd = new EndResult { param1 = SwitchToId, param2 = (int)AI, param3 = chargeOf, param8 = duration, }, targetEnd = null, }, SkillId = skCfg.ID, OringinOP = EffectOp.SwitchNpc, }; SrcParam.described.srcEnd.obj = ctorToShowcase(npcRt, npcCfg, BuffIds, Locale); container.Add(SrcParam); }
//百分比交换 void PercentExchange(List <AttrbuteConfig> used, NPCData self, NPCData tar, float Min, WarSrcAnimParam SrcParam, WarTarAnimParam TarParam) { int cnt = used.Count; if (cnt <= 0) { return; } for (int i = 0; i < cnt; ++i) { AttrbuteConfig att = used[i]; NPCRuntimeData selfRt = self.rtData; NPCRuntimeData tarRt = tar.rtData; NPCConfigData selfCfg = self.configData; NPCConfigData tarCfg = tar.configData; float selfCfgVal = selfCfg.getValue <float>(att.note); float tarCfgVal = tarCfg.getValue <float>(att.note); float selfRtVal = selfRt.getFloatValue(att.note); float tarRtVal = tarRt.getFloatValue(att.note); //自己的值 float self_att1_per = selfRtVal / selfCfgVal; //敌人的值 float tar_att1_per = tarRtVal / tarCfgVal; //敌人值的下限 float tar_att1_per_min = Min; float tarVal = 0f; //如果传递过去的百分比大于下限,则将自己的值和敌人直接替换 if (self_att1_per > tar_att1_per_min) { tarVal = tarCfgVal * self_att1_per; } else { tarVal = tarCfgVal * tar_att1_per_min; } if (att.type == "float") { tarRt.setValue(att.note, tarVal); } else { tarRt.setValue(att.note, (int)tarVal); } float selfVal = selfCfgVal * tar_att1_per; if (att.type == "float") { selfRt.setValue(att.note, selfVal); } else { selfRt.setValue(att.note, (int)selfVal); } /// /// 血量的信息需要特别的传递给UI /// if (att.note == "curHp") { SrcParam.described.srcEnd = new EndResult() { param1 = (int)(selfVal - selfRtVal), param2 = TarParam.described.target, }; TarParam.described.targetEnd = new EndResult() { param1 = (int)(tarVal - tarRtVal), param2 = TarParam.described.target, }; } } }
public void Cast(ServerNPC src, IEnumerable <ServerNPC> skTarget, IEnumerable <ServerNPC> target, bool skDirectHurt, List <MsgParam> container) { #if DEBUG Utils.Assert(cfg == null, "Effect Configure Data is null in ExchangeNpcAttrEffect."); #endif bool any = target.Any(); if (any) { NPCAttributeModel model = Core.Data.getIModelConfig <NPCAttributeModel>(); AttrbuteConfig att1 = model.get(cfg.Param1); AttrbuteConfig att2 = model.get(cfg.Param2); AttrbuteConfig att3 = model.get(cfg.Param3); List <AttrbuteConfig> used = new List <AttrbuteConfig>(); if (att1 != null) { used.Add(att1); } if (att2 != null) { used.Add(att2); } if (att3 != null) { used.Add(att3); } //是否为固定值还是比例值 bool Fixture = cfg.Param6 == 0; //设置可改变下限-- 只有当cfg.Param6 = 1时才有意义 float factor = cfg.Param5 * Consts.OneThousand; //设置可改变下限-- 只有当cfg.Param6 = 0时才有意义 int Min = cfg.Param5; //运行时的数据, ServerNPC tar = target.FirstOrDefault(); if (tar != null) { //统计信息 WarSrcAnimParam SrcParam = new WarSrcAnimParam() { OP = EffectOp.ExchangeNpcAttri, OringinOP = EffectOp.ExchangeNpcAttri, SkillId = skCfg.ID, described = new SelfDescribed() { src = src.UniqueID, target = src.UniqueID, }, ShootAction = skCfg.ShootAction, ShootTime = skCfg.ShootTime, ShootEventTime = skCfg.ShootEventTime, }; WarTarAnimParam TarParam = new WarTarAnimParam() { OP = EffectOp.ExchangeNpcAttri, OringinOP = EffectOp.ExchangeNpcAttri, SkillId = skCfg.ID, described = new SelfDescribed() { src = src.UniqueID, target = tar.UniqueID, }, HitAction = cfg.HitAction, }; if (Fixture) { FixtureExchange(used, src.data.rtData, tar.data.rtData, Min, SrcParam, TarParam); } else { PercentExchange(used, src.data, tar.data, factor, SrcParam, TarParam); } container.Add(SrcParam); container.Add(TarParam); } } }
public virtual void On_Attack(WarMsgParam param) { if (STATE != NpcAnimState.Killed && !isAttack && !isCastSkill) { WarSrcAnimParam srcParam = param as WarSrcAnimParam; atkParam = srcParam; // Debug.Log(JSON.Instance.ToJSON(atkParam), gameObject); if (srcParam != null) { int index = cachedNpc.AttIndex; STATE = NpcAnimState.Attack; Effect3DModelConfigData ecd = Core.Data.getIModelConfig <Effect3DModel>().get(srcParam.ShootAction); if (ecd != null) { isAttack = true; canNextAnim = false; canTriggerEvent = true; animationTimer = srcParam.ShootTime; animationEventTimer = srcParam.ShootEventTime; attackWaitForNext = 0.3f; attackIndex = index; SetHandler = AttackHandle; WarTarAnimParam[] targets = atkParam.InjureTar; BNPC npc = null; if (targets != null && targets.Length > 0) { npc = serMgr.npcMgr.GetNPCByUniqueID(targets[0].described.target); if (npc != null) { lastTarget = "Target:" + targets[0].described.target; Vector3 pos = npc.transform.position; pos.y = cachedTran.position.y; cachedTran.LookAt(pos); } } AnimationMsg msg = new AnimationMsg(); msg.animationTimer = animationTimer; msg.animationEventTimer = animationEventTimer; msg.index = index; msg.ecd = ecd; msg.animationName = ecd.Anim; msg.targetId = (npc == null) ? 0 : npc.UniqueID; msg.arg1 = srcParam.described.targetEnd.param8; msg.arg2 = srcParam.described.targetEnd.param9; string a_data = JSON.Instance.ToJSON(msg); NpcAnimInfo info = new NpcAnimInfo() { ClientID = DeviceInfo.GUID, nextState = NpcAnimState.Attack, data = a_data, }; animMsg.nextAnim = WarMsg_Type.Attack.ToString(); animMsg.uniqueId = cachedNpc.UniqueID; animMsg.data = JSON.Instance.ToJSON(info); if (serMgr != null) { serMgr.realServer.proxyCli.NPCAnim(animMsg); } } else { On_Stand(null); } } } }
public virtual void On_CastSkill(WarMsgParam param) { if (STATE != NpcAnimState.Killed && !isCastSkill) { // WarSrcAnimParam srcParam = param as WarSrcAnimParam; // int index = param.arg1; // List<ISkImp> ops = null; // ISkImp sk = null; // if (!sk_Imps.TryGetValue(index, out ops)) // { // ops = new List<ISkImp>(); // sk_Imps.Add(index, ops); // } // sk = ops.Find(imp => imp.SkOp() == srcParam.OP); // if (sk == null) // { // sk = SkImpFactory.getSkImp(srcParam.OP); // ops.Add(sk); // } // sk.Reset(); // sk.InitSk(cachedNpc, param); // sk.CastSk(); } if (STATE != NpcAnimState.Killed && !isAttack && !isCastSkill) { WarSrcAnimParam srcParam = param as WarSrcAnimParam; Debug.Log(JSON.Instance.ToJSON(param)); skParam = srcParam; if (srcParam != null) { STATE = NpcAnimState.CastSkill; Effect3DModelConfigData ecd = Core.Data.getIModelConfig <Effect3DModel>().get(srcParam.ShootAction); if (ecd != null) { isCastSkill = true; canNextAnim = false; canTriggerEvent = true; animationTimer = srcParam.ShootTime; animationEventTimer = srcParam.ShootEventTime; SetHandler = Skill_Handle; AnimationMsg msg = new AnimationMsg(); msg.animationTimer = animationTimer; msg.animationEventTimer = animationEventTimer; msg.index = param.arg1; msg.ecd = ecd; msg.animationName = ecd.Anim; msg.targetId = 0; if (srcParam.described != null && srcParam.OP == EffectOp.CtorNPC) { EndResult result = srcParam.described.srcEnd; CreatNpcDepandency cnd = (CreatNpcDepandency)result.obj; msg.objCrtV = cnd.TargetVector3; } WarTarAnimParam[] targets = skParam.InjureTar; BNPC npc = null; if (targets != null && targets.Length > 0) { msg.targetId = targets[0].described.target; npc = serMgr.npcMgr.GetNPCByUniqueID(targets[0].described.target); if (npc != null) { lastTarget = "Target:" + targets[0].described.target; Vector3 pos = npc.transform.position; pos.y = cachedTran.position.y; cachedTran.LookAt(pos); } } string a_data = JSON.Instance.ToJSON(msg); NpcAnimInfo info = new NpcAnimInfo() { ClientID = DeviceInfo.GUID, nextState = NpcAnimState.CastSkill, data = a_data, }; animMsg.nextAnim = WarMsg_Type.UseSkill.ToString(); animMsg.uniqueId = cachedNpc.UniqueID; animMsg.data = JSON.Instance.ToJSON(info); if (serMgr != null) { serMgr.realServer.proxyCli.NPCAnim(animMsg); } } else { On_Stand(null); } } } }
/// <summary> /// Buff结束时,处理的逻辑 /// </summary> public void EndCast(RtBufData rtbf) { /// /// --- 解除NPC的状态 --- /// ServerNPC hang = BFSelector.getHangUp(rtbf); ServerLifeNpc life = hang as ServerLifeNpc; if (life != null) { NpcStatus status = (NpcStatus)Enum.ToObject(typeof(NpcStatus), rtbf.BuffCfg.Status); //去除不需要挂载的状态 status = status.rmDiscrete(); /// /// 如果还有同类型的,其他Buff则不应该清除Buff的状态 /// if (status != NpcStatus.None) { NpcStatus toCleared = WarServerManager.Instance.bufMgr.SiftOutStatus(status, rtbf.ID, rtbf.HangUpNpcID); life.curStatus = life.curStatus.clear(toCleared); } /// /// 删除嘲讽的目标 /// if (status.check(NpcStatus.Taunt)) { life.clearSpecHatred(rtbf.CastorNpcID); } } /// /// ---- 解除挂载的Trigger ---- /// int NpcId = hang.UniqueID; WarServerManager.Instance.triMgr.RemoveTrigger(rtbf.TriggerID, NpcId); /// /// ---- 是否删除NPC (目前不适用) ---- /// if (life != null) { SelfDescribed des = new SelfDescribed() { src = hang.UniqueID, target = hang.UniqueID, act = Verb.Punch, srcEnd = null, targetEnd = new EndResult( ) { param1 = life.data.rtData.totalHp * 10, param2 = 0, param3 = 2, }, }; WarSrcAnimParam warParam = new WarSrcAnimParam() { OP = EffectOp.Injury, described = des, }; } /// /// ---- 释放技能 --- /// castBuff_Skill(rtbf, BuffPhase.End); }
public virtual void On_CastTrigger(WarMsgParam param) { if (STATE != NpcAnimState.Killed) { WarSrcAnimParam srcParam = param as WarSrcAnimParam; int index = param.arg1; List <ISkImp> ops = null; ISkImp sk = null; if (!sk_Imps.TryGetValue(index, out ops)) { ops = new List <ISkImp>(); sk_Imps.Add(index, ops); } sk = ops.Find(imp => imp.SkOp() == srcParam.OP); if (sk == null) { sk = SkImpFactory.getSkImp(srcParam.OP); ops.Add(sk); } sk.Reset(); sk.InitSk(cachedNpc, param); sk.CastSk(); } if (STATE != NpcAnimState.Killed && !isAttack && !isCastSkill) { WarSrcAnimParam srcParam = param as WarSrcAnimParam; skParam = srcParam; if (srcParam != null) { STATE = NpcAnimState.CastTrigger; Effect3DModelConfigData ecd = Core.Data.getIModelConfig <Effect3DModel>().get(srcParam.ShootAction); if (ecd != null) { isCastSkill = true; canNextAnim = false; canTriggerEvent = true; animationTimer = srcParam.ShootTime; animationEventTimer = 0.2f; SetHandler = Trigger_Handle; AnimationMsg msg = new AnimationMsg(); msg.animationTimer = animationTimer; msg.animationEventTimer = animationEventTimer; msg.ecd = ecd; msg.animationName = ecd.Anim; msg.targetId = 0; string a_data = JSON.Instance.ToJSON(msg); NpcAnimInfo info = new NpcAnimInfo() { ClientID = DeviceInfo.GUID, nextState = NpcAnimState.CastBuff, data = a_data, }; animMsg.nextAnim = WarMsg_Type.UseTrigger.ToString(); animMsg.uniqueId = cachedNpc.UniqueID; animMsg.data = JSON.Instance.ToJSON(info); if (serMgr != null) { serMgr.realServer.proxyCli.NPCAnim(animMsg); } } else { On_Stand(null); } } } }
public void CastSk(params Object[] args) { if (castor != null && param != null) { WarSrcAnimParam srcParam = param as WarSrcAnimParam; if (srcParam != null) { SelfDescribed sd = srcParam.described; if (sd != null) { EndResult result = sd.srcEnd; CreatNpcDepandency cnd = (CreatNpcDepandency)result.obj; if (cnd != null && cnd.TargetVector3 != null) { VirtualNpcLoader loader = Core.ResEng.getLoader <VirtualNpcLoader>(); GameObject obj = null; Vector3 pos = Vector3.zero; foreach (Vec3F v in cnd.TargetVector3) { pos = v.toUnityVec3(); int id = result.param1; obj = loader.LoadNpcObj(id, castor.Camp, pos, Quaternion.LookRotation(Vector3.back)); if (obj != null) { ServerNPC npc = obj.GetComponent <ServerNPC>(); if (npc != null) { SendCrtNpcMsg(npc); castor.addChildNpc(npc); npc.data = cnd.Source; npc.Init(castor, srcParam); if (npc.collider != null) { npc.collider.enabled = cnd.IsCollide; } if (npc is LifeSummonNPC) { AttachAI(npc, result.param2); } if (cnd.Buff_IDs != null) { for (int i = 0; i < cnd.Buff_IDs.Length; i++) { BuffCtorParam bp = new BuffCtorParam(); bp.bufNum = cnd.Buff_IDs[i]; bp.fromNpcId = castor.UniqueID; bp.toNpcId = npc.UniqueID; bp.origin = AW.Data.OriginOfBuff.Alone; bp.duration = Consts.USE_BUFF_CONFIG_DURATION; bp.initLayer = 1; WarServerManager.Instance.bufMgr.createBuff(bp); } } } } } } } } } }
//固定比例交换 void FixtureExchange(List <AttrbuteConfig> used, NPCRuntimeData selfRt, NPCRuntimeData tarRt, int Min, WarSrcAnimParam SrcParam, WarTarAnimParam TarParam) { int cnt = used.Count; if (cnt <= 0) { return; } for (int i = 0; i < cnt; ++i) { AttrbuteConfig att = used[i]; //自己的值 float self_att1_val = selfRt.getFloatValue(att.note); //敌人的值 float tar_att1_val = tarRt.getFloatValue(att.note); //敌人值的下限 float tar_att1_val_min = (float)Min; float final_tar_val = 0F; //如果传递过去的值大于下限,则将自己的值和敌人直接替换 if (self_att1_val > tar_att1_val_min) { final_tar_val = self_att1_val; } else { //如果传递过去的值小于下限,则将敌人的值给自己,敌人的为最低下限 final_tar_val = tar_att1_val_min; } //敌人 if (att.type == "float") { tarRt.setValue(att.note, (FloatFog)final_tar_val); } else { tarRt.setValue(att.note, (Int32Fog)final_tar_val); } //自己 if (att.type == "float") { selfRt.setValue(att.note, (FloatFog)tar_att1_val); } else { selfRt.setValue(att.note, (Int32Fog)tar_att1_val); } /// /// 血量的信息需要特别的传递给UI /// if (att.note == "curHp") { SrcParam.described.srcEnd = new EndResult() { param1 = (int)(tar_att1_val - self_att1_val), param2 = TarParam.described.target, }; TarParam.described.targetEnd = new EndResult() { param1 = (int)(final_tar_val - tar_att1_val), param2 = TarParam.described.target, }; } } }
/// <summary> /// 释放技能效果 /// </summary> /// <param name="src">效果发起者</param> /// <param name="skTarget">技能选择的目标, 无意义</param> /// <param name="target">技能先选择目标后,再次Effect选择后的目标</param> /// <param name="skDirectHurt">是否是技能的直接伤害, 这个没有伤害</param> /// <param name="container">所有数据展现的容器,本次Effect施法的效果会依次加入</param> public void Cast(ServerNPC src, IEnumerable <ServerNPC> skTarget, IEnumerable <ServerNPC> target, bool skDirectHurt, List <MsgParam> container) { #if DEBUG Utils.Assert(skCfg == null, "Skill Configure is null in BulletNpcEffect routine."); #endif WarSrcAnimParam SrcParam = new WarSrcAnimParam() { OP = EffectOp.CtorNPC, ShootAction = skCfg.ShootAction, ShootTime = skCfg.ShootTime, ShootEventTime = skCfg.ShootEventTime, }; int CtorNpcId = cfg.Param1; float LifeTime = cfg.Param2 * Consts.OneThousand; CtorNpcPos pos = (CtorNpcPos)Enum.ToObject(typeof(CtorNpcPos), cfg.Param3); //碰撞 bool Collide = cfg.Param4 == 1; int AI_ID = cfg.Param5; int param_1 = cfg.Param8; int param_2 = cfg.Param10; //会有的Buff int[] BuffIDList = cfg.Param11; //数据源 CtorNpcSource datasrc = (CtorNpcSource)Enum.ToObject(typeof(CtorNpcSource), cfg.Param6); //数据源的修正 CtorNpcAttri attr_1 = (CtorNpcAttri)Enum.ToObject(typeof(CtorNpcAttri), cfg.Param7); CtorNpcAttri attr_2 = (CtorNpcAttri)Enum.ToObject(typeof(CtorNpcAttri), cfg.Param9); /// /// 获取数据源 /// NPCData data = new NPCData(); NPCConfigData cfgD = null; NPCRuntimeData rtD = null; if (datasrc == CtorNpcSource.NPC_Table) { NPCModel model = Core.Data.getIModelConfig <NPCModel>(); cfgD = model.get(CtorNpcId); Utils.Assert(cfgD == null, "Can't find NPC configure. NPC ID = " + CtorNpcId); } else if (datasrc == CtorNpcSource.NPC_Castro_Cur) { cfgD = src.data.configData; rtD = src.data.rtData.ShallowCopy(); } else if (datasrc == CtorNpcSource.NPC_Castor_Init) { cfgD = src.data.configData; } rtD = rtD ?? new NPCRuntimeData(cfgD); List <String> changed_1 = attr_1.SwitchTo(); List <String> changed_2 = attr_2.SwitchTo(); int cnt = changed_1.Count; if (cnt > 0) { for (int i = 0; i < cnt; ++i) { rtD.setValue(changed_1[i], (Int32Fog)param_1); } } cnt = changed_2.Count; if (cnt > 0) { for (int i = 0; i < cnt; ++i) { rtD.setValue(changed_2[i], (Int32Fog)param_2); } } data.configData = cfgD; data.rtData = rtD; /// /// 获取目标位置 /// List <UVec3> TargetVec3 = new List <UVec3>(); if (pos == CtorNpcPos.Castor_Forward) { TargetVec3.Add(src.transform.forward); } else if (pos == CtorNpcPos.Target) { foreach (ServerNPC t in target) { TargetVec3.Add(t.transform.position); } } else if (pos == CtorNpcPos.Castor_Surround) { TargetVec3.Add(src.transform.position); } /// /// ------ 获取统计信息 ------ /// SelfDescribed des = new SelfDescribed() { src = src.UniqueID, target = src.UniqueID, act = Verb.Creature, srcEnd = new EndResult { param1 = CtorNpcId, param2 = AI_ID, param8 = LifeTime, }, targetEnd = null, }; des.srcEnd.obj = ctorToShowcase(Collide, data, BuffIDList, TargetVec3, src); SrcParam.SkillId = skCfg.ID; SrcParam.described = des; container.Add(SrcParam); }
public void Cast(ServerNPC src, IEnumerable <ServerNPC> skTarget, IEnumerable <ServerNPC> target, bool skDirectHurt, List <MsgParam> container) { #if DEBUG Utils.Assert(src == null, "Injury Effect can't find attacker."); Utils.Assert(skCfg == null, "Skill Configure is null in Injury Effect ."); #endif //发起者的信息 WarSrcAnimParam SrcParam = new WarSrcAnimParam() { OP = EffectOp.Injury, ShootAction = skCfg.ShootAction, ShootTime = skCfg.ShootTime, ShootEventTime = skCfg.ShootEventTime, //Debug信息 SkillId = skCfg == null ? -1 : skCfg.ID, }; SelfDescribed SrcDes = new SelfDescribed() { src = src.UniqueID, target = src.UniqueID, act = Verb.Punch, srcEnd = null, targetEnd = new EndResult() { param1 = 0, param2 = 0, param3 = 0, param4 = 0, param8 = skCfg.MissileSpeed, param9 = skCfg.Distance, }, }; SrcParam.described = SrcDes; List <ServerNPC> effTarget = target.ToList(); int count = effTarget.Count; //如果没有目标的时候 if (count == 0) { SrcParam.InjureTar = null; //新建一个目标为空的序列,主要告知skCfg.MissileSpeed 和 skCfg.Distance //该技能没有目标去命中 container.Add(SrcParam); return; } //如果存在目标的时候 InjuryOp cal = OpMgr.getImplement <InjuryOp>(EffectOp.Injury); List <ServerNPC> skillTarget = skTarget.ToList(); /// /// ---- 获取主目标 /// int MainTargetID = 0; int skcount = skillTarget.Count; if (skcount > 0) { ServerNPC npc = skillTarget[0]; MainTargetID = npc.UniqueID; } //count 必定 > 0 //如果是技能直接的伤害 if (skDirectHurt) { WarTarAnimParam[] TarList = new WarTarAnimParam[count]; for (int i = 0; i < count; ++i) { WarTarAnimParam TarParam = new WarTarAnimParam() { OP = EffectOp.Injury, HitAction = cfg.HitAction, SkillId = skCfg.ID, }; ServerNPC tar = effTarget[i]; Dmg dmg = cal.toTargetDmg(src.data, tar.data, cfg); SelfDescribed des = new SelfDescribed() { src = src.UniqueID, target = tar.UniqueID, act = Verb.Punch, srcEnd = null, targetEnd = new EndResult() { param1 = (int)dmg.dmgValue, param2 = dmg.isCritical ? 1 : 0, param3 = (int)dmg.dmgType, param4 = (int)dmg.hitCls, param5 = MainTargetID, param8 = skCfg.MissileSpeed, param9 = skCfg.Distance, }, }; TarParam.described = des; TarList[i] = TarParam; } SrcParam.InjureTar = TarList; container.Add(SrcParam); } else { container.Add(SrcParam); //如果不是技能的伤害,而是buff或者Trigger的伤害 for (int i = 0; i < count; ++i) { WarTarAnimParam TarParam = new WarTarAnimParam() { OP = EffectOp.Injury, HitAction = cfg.HitAction, SkillId = skCfg.ID, }; ServerNPC tar = effTarget[i]; Dmg dmg = cal.toTargetDmg(src.data, tar.data, cfg); SelfDescribed des = new SelfDescribed() { src = src.UniqueID, target = tar.UniqueID, act = Verb.Punch, srcEnd = null, targetEnd = new EndResult() { param1 = (int)dmg.dmgValue, param2 = dmg.isCritical ? 1 : 0, param3 = (int)dmg.dmgType, param4 = (int)dmg.hitCls, param5 = MainTargetID, param8 = skCfg.MissileSpeed, param9 = skCfg.Distance, }, }; TarParam.described = des; container.Add(TarParam); } } }