Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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);
            }
        }
Ejemplo n.º 3
0
    //默认的初始化方式
    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;
    }
Ejemplo n.º 4
0
        /// 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);
            }
        }
Ejemplo n.º 5
0
        /// <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);
                    }
                }
            }
        }
Ejemplo n.º 6
0
        ///
        /// 根据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;
        }
Ejemplo n.º 7
0
        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);
        }
Ejemplo n.º 8
0
        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);
            }
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
        /// <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);
        }
Ejemplo n.º 11
0
        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);
        }
Ejemplo n.º 12
0
    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);
        }
    }
Ejemplo n.º 13
0
        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);
        }
Ejemplo n.º 14
0
    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);
        }
    }
Ejemplo n.º 15
0
        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);
        }
Ejemplo n.º 16
0
        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;
                    }
                }
            }
        }
Ejemplo n.º 17
0
        //百分比交换
        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,
                    };
                }
            }
        }
Ejemplo n.º 18
0
 public NPCRuntimeData(NPCConfigData cfg)
 {
     defaultInit(cfg);
     c_bf = BindingFlags.Instance | BindingFlags.Public;
 }
Ejemplo n.º 19
0
        /// <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);
        }
Ejemplo n.º 20
0
        ///
        /// 先尝试从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);
        }
Ejemplo n.º 21
0
        /// <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);
        }
Ejemplo n.º 22
0
        /// <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);
        }
Ejemplo n.º 23
0
        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);
        }