/// <summary> /// 加载子弹型npc /// </summary> /// <returns>The bullet npc.</returns> /// <param name="num">Number.</param> /// <param name="camp">Camp.</param> /// <param name="pos">Position.</param> /// <param name="rot">Rot.</param> public GameObject LoadBulletNpc(int num, CAMP camp, Vector3 pos, Quaternion rot) { if (NpcModel == null) { NpcModel = Core.Data.getIModelConfig <NPCModel>(); } NPCConfigData configData = NpcModel.get(num); #if DEBUG Utils.Assert(configData == null, "Virtual Npc load can't find npc configure. NPC id = " + num); #endif string path = SPath.Combine(ResourceSetting.PACKROOT, NPC); path = SPath.Combine(path, "ServerBulletNpc"); UObj obj = URes.Load(path); GameObject go = GameObject.Instantiate(obj) as GameObject; go.transform.position = pos; go.transform.rotation = rot; ServerNPC npc = go.GetComponent <ServerNPC>(); if (npc != null) { DynamicDataInit(npc, configData, camp); } return(go); }
/// <summary> /// 数据的初始化 /// </summary> /// <param name="go">Go.</param> /// <param name="num">Number.</param> /// <param name="id">Identifier.</param> /// <param name="camp">Camp.</param> void DynamicDataInit(GameObject go, int num, CAMP camp, int Id) { ClientNPC curHero = go.GetComponent <ClientNPC>(); /// /// 填充阵营 /// curHero.Camp = camp; /// /// 填充NPC数据 /// NPCData dynamicData = new NPCData(); NPCConfigData econfig = NpcModel.get(num); dynamicData.rtData = new NPCRuntimeData(econfig); dynamicData.configData = econfig; dynamicData.btData = new NPCBattleData(); curHero.data = dynamicData; if (Id != 0) { curHero.UniqueID = Id; cliNpcMgr.SignExistID(curHero); } else { /// /// 向WarClientNpcManager注册 /// cliNpcMgr.SignID(curHero); } }
//默认的初始化方式 void defaultInit(NPCConfigData cfg) { this.lv = 1; this.num = cfg.ID; this.curHp = cfg.healthpoint; this.totalConstHp = cfg.healthpoint; this.totalTempHp = cfg.healthpoint; this.attackpower = cfg.attackpower; this.armorclass = cfg.armorclass; this.armorpenetration = cfg.armorpenetration; this.spellpower = cfg.spellpower; this.spellresistance = cfg.spellresistance; this.spellpenetration = cfg.spellpenetration; this.attackdamagereduction = cfg.attackdamagereduction; this.spelldamagereduction = cfg.spelldamagereduction; this.speed = cfg.speed; this.crit = cfg.crit; this.BeHeal = cfg.BeHeal; this.critresistance = cfg.critresistance; this.additionalcrit = cfg.additionalcrit; this.attacklifesteal = cfg.attacklifesteal; this.spelllifesteal = cfg.spelllifesteal; this.attackspeed = cfg.attackspeed; this.additionalreduction = cfg.additionalreduction; this.attackdamageback = cfg.attackdamageback; this.spelldamageback = cfg.spelldamageback; this.recovery = cfg.recovery; this.attackadditionaldamage = cfg.attackadditionaldamage; this.Protection = 0f; this.factor = cfg.factor; this.seekRange = cfg.seekRange; this.fleeRange = cfg.fleeRange; }
/// 1.英雄 > 召唤兽 > 小兵 > 防御塔 > 建筑 (英雄使用) public void SortByPriority(IEnumerable <ServerNPC> unPriority, WarServerNpcMgr npcMgr, List <List <ServerNPC> > HasPriority) { //已经排好序的 if (HasPriority == null) { HasPriority = new List <List <ServerNPC> >(); } else { HasPriority.Clear(); } for (int i = 0; i < 5; ++i) { HasPriority.Add(null); } foreach (ServerNPC npc in unPriority) { NPCConfigData cfg = npc.data.configData; ExistFlag totest = LifeNpcType2ExistFlag(cfg.type, cfg.bldType); /// /// 如果属于不关心的类型,则丢弃 /// if (totest == ExistFlag.None) { continue; } base.addNpcByPriority(npc, (byte)totest, HasPriority); } }
/// <summary> /// 数据的初始化 /// </summary> /// <param name="go">Go.</param> /// <param name="num">Number.</param> /// <param name="id">Identifier.</param> /// <param name="camp">Camp.</param> void DynamicDataInit(ServerNPC curHero, NPCConfigData econfig, CAMP camp) { /// /// 填充阵营 /// curHero.Camp = camp; /// /// 填充NPC数据 /// NPCData dynamicData = new NPCData(); dynamicData.rtData = new NPCRuntimeData(econfig); dynamicData.configData = econfig; dynamicData.btData = new NPCBattleData(); curHero.data = dynamicData; /// /// 向WarManager注册 /// serNpcMgr.SignID(curHero); WarServerManager warMgr = WarServerManager.Instance; /// /// 填充技能数据 /// RtNpcSkillModel skMd = new RtNpcSkillModel(econfig.ID, curHero.UniqueID); ServerLifeNpc life = curHero as ServerLifeNpc; if (life != null) { life.runSkMd = skMd; } /// /// 填充默认的buff /// for (short i = 0; i < Consts.MAX_SKILL_COUNT; ++i) { RtSkData sk = skMd.getRuntimeSkill(i); if (sk != null) { int passive = sk.skillCfg.PassiveBuff; if (passive > 0) { BuffCtorParam ctor = new BuffCtorParam() { bufNum = passive, fromNpcId = curHero.UniqueID, toNpcId = curHero.UniqueID, origin = OriginOfBuff.BornWithSkill, initLayer = 1, duration = Consts.USE_BUFF_CONFIG_DURATION, }; warMgr.bufMgr.createBuff(ctor); } } } }
/// /// 根据NPC的ID来构造技能数据模型 /// public RtNpcSkillModel(int NpcNum, int NpcId) { this.NpcId = NpcId; AllSkill = new List <RtSkData>(); NormalHit = new List <RtSkData>(); NPCModel model = Core.Data.getIModelConfig <NPCModel>(); NPCConfigData npc = model.get(NpcNum); Utils.Assert(npc == null, "Can't find NPC configure. Npc Num = " + NpcNum); RtSkData sk = null; int count = npc.skill.Length; for (int i = 0; i < count; ++i) { int skillId = npc.skill[i]; if (skillId != 0) { sk = new RtSkData(skillId, (short)i); AllSkill.Add(sk); } else { AllSkill.Add(null); } } if (npc.specialskill != 0) { sk = new RtSkData(npc.specialskill, 3); AllSkill.Add(sk); } else { AllSkill.Add(null); } ///普通的攻击其实也是技能 if (npc.normalHit != null) { foreach (int skillId in npc.normalHit) { if (skillId != 0) { sk = new RtSkData(skillId, -1); NormalHit.Add(sk); } else { NormalHit.Add(null); } } } ConCastor = ConditionCastor.instance; }
ExistFlag NPCToFlag(ServerNPC npc, WarServerNpcMgr npcMgr, LifeNPCType type) { ExistFlag tar1 = ExistFlag.None; ExistFlag tar2 = ExistFlag.None; switch (type) { case LifeNPCType.Hero: tar1 = ExistFlag.Hostile_Hero; tar2 = ExistFlag.Hostile_Hero_ATK_Self_Hero; break; case LifeNPCType.Summon: tar1 = ExistFlag.Hostile_Summoner; tar2 = ExistFlag.Hostile_Summoner_ATK_Self_Hero; break; case LifeNPCType.Soldier: tar1 = ExistFlag.Hostile_Minion; tar2 = ExistFlag.Hostile_Minion_ATK_Self_Hero; break; } ExistFlag toTest = ExistFlag.None; //没有攻击过的目标 if (npc.TargetID == -1) { toTest = tar1; } else { ServerNPC targetNpc = npcMgr.GetNPCByUniqueID(npc.TargetID); if (targetNpc != null) { /// /// 发现目标是Hero,则会判定为攻击了英雄 /// NPCConfigData tarCfg = targetNpc.data.configData; if (tarCfg.type.check(LifeNPCType.Hero)) { toTest = tar2; } else { toTest = tar1; } } else { toTest = tar1; } } return(toTest); }
public void SortByPriority(IEnumerable <ServerNPC> unPriority, WarServerNpcMgr npcMgr, List <List <ServerNPC> > HasPriority) { //已经排好序的 if (HasPriority == null) { HasPriority = new List <List <ServerNPC> >(); } else { HasPriority.Clear(); } for (int i = 0; i < 8; ++i) { HasPriority.Add(null); } foreach (ServerNPC npc in unPriority) { ExistFlag toTest = ExistFlag.None; /// /// 挑选出关心的 敌方英雄,敌方召唤物, 敌方小兵 /// NPCConfigData cfg = npc.data.configData; bool careHero = cfg.type.check(LifeNPCType.Hero); bool careSummoner = cfg.type.check(LifeNPCType.Summon); bool careMinion = cfg.type.check(LifeNPCType.Soldier); bool careBuilding = cfg.type.check(LifeNPCType.Build); bool care = careHero || careSummoner || careMinion || careBuilding; if (care == false) { continue; } if (careHero) { toTest = NPCToFlag(npc, npcMgr, LifeNPCType.Hero); } if (careSummoner) { toTest = NPCToFlag(npc, npcMgr, LifeNPCType.Summon); } if (careMinion) { toTest = NPCToFlag(npc, npcMgr, LifeNPCType.Soldier); } if (careBuilding) { toTest = NPCToFlag(npc, npcMgr, LifeNPCType.Build); } base.addNpcByPriority(npc, (byte)toTest, HasPriority); } }
public void ShallowCopy() { NPCConfigData newCfg = cfg.ShallowCopy(); Assert.IsTrue(newCfg.type == LifeNPCType.Build); Assert.IsTrue(newCfg.moveable == Moveable.BeStatic); Assert.IsTrue(newCfg.crit == 0.1F); Assert.IsTrue(newCfg.ID == 3); Assert.IsTrue(newCfg.skill[1] == 2); Assert.IsTrue(newCfg.healthpoint == 300); }
/// <summary> /// 创建NPC, 使用初始化好的数据 /// </summary> /// <param name="num">Number.</param> /// <param name="id">Identifier.</param> /// <param name="camp">Camp.</param> public ClientNPC Load(CAMP camp, NPCData initedData, GameObject WarPoint) { #if DEBUG Utils.Assert(initedData == null, "NpcLoad can't be null "); #endif NPCConfigData configData = initedData.configData; string path = Path.Combine(ResourceSetting.PACKROOT, NPC); path = Path.Combine(path, configData.model.ToString()); //TODO: 是自己队伍里NPC则必须使用ObjLoader去创建 bool cached = ObjLoader.hitCache(path); Object obj = null; if (cached) { obj = ObjLoader.Load(path); } else { obj = WeakObjLoader.Load(path); } if (obj == null) { ConsoleEx.DebugWarning(configData.model + " not find models. Npc Num = " + configData.ID); return(null); } GameObject go = GameObject.Instantiate(obj) as GameObject; UnityUtils.AddChild_Reverse(go, WarPoint); /// /// 填充数据 /// InitedData(go, camp, initedData); ClientNPC npc = go.GetComponent <ClientNPC> (); if (npc != null) { go.name = "NPC_" + npc.data.configData.ID + "_" + npc.UniqueID; if (!string.IsNullOrEmpty(configData.controlScript)) { ClientNpcAnimState animState = go.AddComponent(configData.controlScript) as ClientNpcAnimState; npc.animState = animState; npc.broadcast = animState.OnNewStateReceived; } cliNpcMgr.CreateNpcUI(npc); } return(npc); }
public void Init() { cfg = new NPCConfigData() { type = LifeNPCType.Build, moveable = Moveable.BeStatic, skill = new int[] { 1, 2, 3 }, crit = 0.1f, ID = 3, healthpoint = 300, }; runtime = new NPCRuntimeData(cfg); }
private static void NPCConfigPostprocess() { string path = System.IO.Path.Combine(RESOURCE_NPC_CONFIG_FOLDER, "NPCConfig.xml"); TextReader tr = new StreamReader(path); string text = tr.ReadToEnd(); if (text == null) { Debug.LogError("npc config file not exist"); return; } else { XmlSpreadSheetReader.ReadSheet(text); XmlSpreadSheet sheet = XmlSpreadSheetReader.Output; string[] keys = XmlSpreadSheetReader.Keys; object[] levelIds = sheet[keys[0]]; List <NPCConfigData> tempList = new List <NPCConfigData>(); for (int i = 0; i < levelIds.Length; i++) { if (0 == i || 1 == i) { continue; } NPCConfigData data = new NPCConfigData(); data._NPCID = Convert.ToInt32(sheet["NpcID"][i]); data._szName = Convert.ToString(sheet["NpcName"][i]); data._npcTitle = Convert.ToString(sheet["NpcTitle"][i]); string PrefabName = Convert.ToString(sheet["PortraitID"][i]); string PrefabPath = System.IO.Path.Combine("Assets/Prefab/GUI/IconPrefab/StroyPersonHead", PrefabName + ".prefab"); data.PortraitID = (GameObject)AssetDatabase.LoadAssetAtPath(PrefabPath, typeof(GameObject)); string cameraOffsetStr = Convert.ToString(sheet["CameraOffset"][i]); string[] splitStrs = cameraOffsetStr.Split('|'); data.CameraOffset = new Vector3(Convert.ToSingle(splitStrs[0]), Convert.ToSingle(splitStrs[1]), Convert.ToSingle(splitStrs[2])); string prefabpath = Convert.ToString(sheet["NpcPrefabPath"][i]); string pathRes = System.IO.Path.Combine(ASSET_NPC_RES_CONFIG_FOLDER, prefabpath + ".prefab"); data._NPCPrefab = (GameObject)AssetDatabase.LoadAssetAtPath(pathRes, typeof(GameObject)); tempList.Add(data); } CreateNPCConfigDataBase(tempList); } }
ExistFlag toExistType(ServerNPC npc, WarServerNpcMgr npcMgr) { NPCConfigData cfg = npc.data.configData; ExistFlag flag = LifeNpcType2ExistFlag(cfg.type, cfg.bldType); if (flag == ExistFlag.Hero) { if (npc.TargetID != -1) { ServerNPC npcTar = npcMgr.GetNPCByUniqueID(npc.TargetID); if (npcTar != null) { flag = ExistFlag.HeroTar; } } } return(flag); }
public void InitTalkPanel(SMsgInteractCOMMONPackage sMsgInteractCOMMONPackage) { m_isOpening = true; //send event to joystick of TownUI UIEventManager.Instance.TriggerUIEvent(UIEventType.OnNpcTalkOpenEvent, null); if (BackButton != null) { // m_backButton.ShowAnim(); } transform.localPosition = showPos; //Vector3.zero; int npcID = (int)sMsgInteractCOMMONPackage.sMsgInteractCOMMON_SC.dwNPCID; NPCConfigData npcData = NPCConfigManager.Instance.NPCConfigList[npcID]; UI.CreatObjectToNGUI.InstantiateObj(npcData.PortraitID, HeadPoint); var npcTalkData = GetNpcTalk(sMsgInteractCOMMONPackage); TypeID entityType; Transform npcTransform = EntityController.Instance.GetEntityModel(GameManager.Instance.MeetNpcEntityId, out entityType).GO.transform; if (null != npcTransform) { BattleManager.Instance.FollowCamera.SetSmoothMoveTarget(npcTransform, npcData.CameraOffset); } NpcName.text = LanguageTextManager.GetString(npcData._szName); if (npcTalkData != null) { DialogLabel.text = LanguageTextManager.GetString(npcTalkData._szTalk); if (npcTalkData._szVoice != "0") { SoundManager.Instance.PlaySoundEffect(npcTalkData._szVoice); } } //this.NpcIcon.spriteName = NPCConfigManager.Instance.NPCConfigList[(int)npcID].PortraitID; SMsgInteractCOMMONBtn_SC[] MyButtonList = sMsgInteractCOMMONPackage.sMsgInteractCOMMONBtn_SC; if (MyButtonList.Length > 0) { MiddlePanel.CreateMiddleButton(sMsgInteractCOMMONPackage); } }
CreatNpcDepandency ctorToShowcase(NPCRuntimeData rt, NPCConfigData cfg, int[] BuffIDList, UVec3 TargetVec3) { NPCData data = new NPCData() { configData = cfg, rtData = rt, }; //有碰撞 bool Collide = true; CreatNpcDepandency depandency = new CreatNpcDepandency() { IsCollide = Collide, Source = data, Buff_IDs = BuffIDList, TargetVector3 = new List <Vec3F>(), }; depandency.TargetVector3.Add(TargetVec3.toCustomVec3()); return(depandency); }
void makeUpData(WarCamp camp) { if (camp == WarCamp.FirstCamp || camp == WarCamp.SecondCamp) { List <RoomCharactor> chalist = null; bool exist = allCharactors.TryGetValue(camp, out chalist); if (exist) { foreach (RoomCharactor charactor in chalist) { if (charactor.team is WrapperTeam) { continue; } WrapperTeam wTeam = new WrapperTeam() { dataTeam = new List <NPCData>(), }; foreach (RoomNpc npc in charactor.team.team) { NPCConfigData config = Model.get(npc.NpcNum); NPCData data = new NPCData() { configData = config, rtData = new NPCRuntimeData(config), }; wTeam.dataTeam.Add(data); } wTeam.team = charactor.team.team; charactor.team = wTeam; } } } }
//百分比交换 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 NPCRuntimeData(NPCConfigData cfg) { defaultInit(cfg); c_bf = BindingFlags.Instance | BindingFlags.Public; }
/// <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); }
/// /// 先尝试从ObjLoader里面取,如果不存在则再去WeakObjLoader取 /// /// 但是如果是自己队伍里NPC则必须使用ObjLoader去创建 /// public ClientNPC Load(int num, int id, CAMP camp, GameObject WarPoint) { if (NpcModel == null) { NpcModel = Core.Data.getIModelConfig <NPCModel>(); } NPCConfigData configData = NpcModel.get(num); if (configData == null) { ConsoleEx.DebugWarning("not find npc config data :: " + num); return(null); } string path = Path.Combine(ResourceSetting.PACKROOT, NPC); path = Path.Combine(path, configData.model.ToString()); //TODO: 是自己队伍里NPC则必须使用ObjLoader去创建 bool cached = ObjLoader.hitCache(path); Object obj = null; if (cached) { obj = ObjLoader.Load(path); } else { obj = WeakObjLoader.Load(path); } if (obj == null) { ConsoleEx.DebugWarning(configData.model + " not find models. Npc Num = " + num); return(null); } GameObject go = GameObject.Instantiate(obj) as GameObject; UnityUtils.AddChild_Reverse(go, WarPoint); /// /// 数据的初始化过程 /// DynamicDataInit(go, num, camp, id); ClientNPC npc = go.GetComponent <ClientNPC> (); if (npc != null) { go.name = "NPC_" + npc.data.configData.ID + "_" + npc.UniqueID; if (!string.IsNullOrEmpty(configData.controlScript)) { ClientNpcAnimState animState = go.AddComponent(configData.controlScript) as ClientNpcAnimState; npc.animState = animState; animState.CachedNpc = npc; animState.AttackCount = configData.normalHit.Length; npc.broadcast = animState.OnNewStateReceived; } cliNpcMgr.CreateNpcUI(npc); } return(npc); }
/// <summary> /// Loads the bullet. /// </summary> /// <returns>The bullet.</returns> /// <param name="num">Number.</param> /// <param name="camp">Camp.</param> /// <param name="pos">Position.</param> /// <param name="rot">Rot.</param> public GameObject LoadNpcObj(int num, CAMP camp, Vector3 pos, Quaternion rot) { if (NpcModel == null) { NpcModel = Core.Data.getIModelConfig <NPCModel>(); } NPCConfigData configData = NpcModel.get(num); #if DEBUG Utils.Assert(configData == null, "Virtual Npc load can't find npc configure. NPC id = " + num); #endif string path = SPath.Combine(ResourceSetting.PACKROOT, NPC); if (configData.healthpoint > 0) { path = SPath.Combine(path, "LifeSummonNpc"); } else { path = SPath.Combine(path, "NoneLifeSummonNpc"); } UObj obj = URes.Load(path); GameObject go = GameObject.Instantiate(obj) as GameObject; go.transform.position = pos; go.transform.rotation = rot; if (configData.moveable == Moveable.Movable) { Seeker seek = go.AddComponent <Seeker>(); seek.drawGizmos = false; AIPath pathFinding = go.AddComponent <AIPath>(); pathFinding.speed = configData.speed; pathFinding.slowdownDistance = 0.0f; pathFinding.pickNextWaypointDist = 2; pathFinding.forwardLook = 1f; FunnelModifier modifer = go.AddComponent <FunnelModifier>(); modifer.Priority = 2; CharacterController box = go.AddComponent <CharacterController>(); box.radius = configData.radius; box.height = 2; if (box.radius >= box.height) { box.center = Vector3.up * box.radius; } else { box.center = Vector3.up * box.height / 2; } } else if (configData.radius > 0) { CapsuleCollider cap = go.AddComponent <CapsuleCollider>(); cap.radius = configData.radius; cap.height = 2; if (cap.radius >= cap.height) { cap.center = Vector3.up * cap.radius; } else { cap.center = Vector3.up * cap.height / 2; } NavmeshCut cut = go.AddComponent <NavmeshCut>(); cut.type = NavmeshCut.MeshType.Circle; cut.circleRadius = configData.radius; cut.height = 10; cut.center = Vector3.up * 5; } ServerNPC npc = go.GetComponent <ServerNPC>(); if (npc != null) { DynamicDataInit(npc, configData, camp); } return(go); }
/// <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); }
public ServerNPC Load(int num, CAMP camp, GameObject WarPoint) { if (NpcModel == null) { NpcModel = Core.Data.getIModelConfig <NPCModel>(); } NPCConfigData configData = NpcModel.get(num); #if DEBUG Utils.Assert(configData == null, "Virtual Npc load can't find npc configure. NPC id = " + num); #endif if (cached == null) { string path = SPath.Combine(ResourceSetting.PACKROOT, NPC); path = SPath.Combine(path, VIRTUAL); cached = URes.Load(path); } GameObject go = GameObject.Instantiate(cached) as GameObject; UnityUtils.AddChild_Reverse(go, WarPoint); if (configData.type == LifeNPCType.Build) { go.layer = LayerMask.NameToLayer(Consts.LAYER_BUILD); } else { go.layer = LayerMask.NameToLayer(Consts.LAYER_NPC); } ServerNPC npc = null; if (configData.healthpoint > 0) { npc = go.AddComponent <ServerLifeNpc>(); } else { npc = go.AddComponent <ServerNPC>(); } //如果是可以移动的,添加寻路脚本 if (configData.moveable == Moveable.Movable) { Seeker seek = go.AddComponent <Seeker>(); seek.drawGizmos = false; AIPath pathFinding = go.AddComponent <AIPath>(); pathFinding.speed = configData.speed; pathFinding.slowdownDistance = 0.0f; pathFinding.pickNextWaypointDist = 2; pathFinding.forwardLook = 1f; FunnelModifier modifer = go.AddComponent <FunnelModifier>(); modifer.Priority = 2; CharacterController box = go.AddComponent <CharacterController>(); box.radius = configData.radius; box.height = 2; if (box.radius >= box.height) { box.center = Vector3.up * box.radius; } else { box.center = Vector3.up * box.height / 2; } } else if (configData.radius > 0) { CapsuleCollider cap = go.AddComponent <CapsuleCollider>(); cap.radius = configData.radius; cap.height = 2; if (cap.radius >= cap.height) { cap.center = Vector3.up * cap.radius; } else { cap.center = Vector3.up * cap.height / 2; } NavmeshCut cut = go.AddComponent <NavmeshCut>(); cut.type = NavmeshCut.MeshType.Circle; cut.circleRadius = configData.radius; cut.height = 10; cut.center = Vector3.up * 5; } DynamicDataInit(npc, configData, camp); go.name = "NPC_" + configData.ID + "_" + npc.UniqueID; return(npc); }