예제 #1
0
        public UnitID CreateNPC(Neptune.NPC npcInfo, Actor parent = null)
        {
            if (npcInfo == null)
            {
                GameDebug.LogError("Error in create npc, npc info is null!!!");
                return(null);
            }

            Vector3 bornPos = npcInfo.Position;

            NpcDefine npcDefine = NpcHelper.MakeNpcDefine((uint)npcInfo.ExcelId);

            if (npcDefine == null)
            {
                GameDebug.LogError("Error in create npc, npc define is null!!!");
                return(null);
            }

            // 护送任务NPC可以创建多个
            if (GetNpcByNpcId((uint)npcInfo.Id) != null && npcDefine.Function != NpcDefine.EFunction.ESCORT)
            {
                return(null);
            }

            uint uuid = GetAvailableUUId(npcInfo, npcDefine);

            DBActor dbActor = DBManager.GetInstance().GetDB <DBActor>();

            DBActor.ActorData actorData = dbActor.GetData((uint)npcDefine.ActorId);

            bornPos = RoleHelp.GetPositionInScene((uint)npcDefine.ActorId, npcInfo.Position.x, npcInfo.Position.z);
            if (npcInfo.Id >= 300)
            {
                GameDebug.LogError("npcInfo.Id is too large! " + npcInfo.Id);
            }
            xc.UnitCacheInfo initData = new xc.UnitCacheInfo(EUnitType.UNITTYPE_NPC, uuid);
            initData.ClientNpc       = npcInfo;
            initData.ClientNpcDefine = NpcHelper.MakeNpcDefine((uint)(npcInfo.ExcelId));
            initData.CacheType       = xc.UnitCacheInfo.EType.ET_Create;
            initData.PosBorn         = bornPos;
            initData.ParentActor     = parent;

            // 如果有父角色,则出生在父角色附近的一个随机位置
            if (parent != null)
            {
                Vector3 pos    = AIHelper.GetActorRangeRandomPosition(parent, 1f, 2f);
                bool    result = false;
                initData.PosBorn = InstanceHelper.ClampInWalkableRange(pos, pos, out result);
            }

            mCreatings.Add(initData.UnitID.obj_idx);

            ActorManager.Instance.PushUnitCacheData(initData);

            return(initData.UnitID);
        }
예제 #2
0
        /// <summary>
        /// 执行NPC的功能
        /// </summary>
        public static void RunNpcFunction(NpcDefine npcDefine)
        {
            NpcDefine.EFunction func       = npcDefine.Function;
            List <string>       funcParams = npcDefine.FunctionParams;

            switch (func)
            {
            case NpcDefine.EFunction.EMPTY:
                break;

            case NpcDefine.EFunction.TRANSFER:
            {
                uint instanceId = 0;
                uint.TryParse(funcParams[0], out instanceId);
                DBInstance.InstanceInfo instanceInfo = DBInstance.Instance.GetInstanceInfo(instanceId);
                if (instanceInfo != null && instanceInfo.mWarType != GameConst.WAR_TYPE_WILD)
                {
                    UIManager.GetInstance().ShowSysWindow("UIInstanceEnterWindow", instanceInfo);
                }
                else
                {
                    SceneHelp.JumpToScene(instanceId);
                }
            }
            break;

            case NpcDefine.EFunction.EXCHANGE:
            {
                xc.ui.UIWidgetHelp.Instance.ShowNoticeDlg(xc.TextHelper.GetConstText("CODE_TEXT_LOCALIZATION_73") + npcDefine.FunctionParams[0]);
            }
            break;

            case NpcDefine.EFunction.DIALOG:
                break;

            case NpcDefine.EFunction.EVENT:
            {
                uint triggerId = 0;
                uint.TryParse(funcParams[0], out triggerId);
                Uranus.Runtime.UranusManager.Instance.ActiveLevelNode(triggerId);
            }
            break;

            case NpcDefine.EFunction.INTERACTION:
            {
                CommonSliderHelper.Interrupt();
                int second = 0;
                int.TryParse(npcDefine.FunctionParams[0], out second);
                CommonSliderHelper.Start(second, npcDefine.ConstBtnText, npcDefine.ConstBtnPic, null, () => {; });
            }
            break;

            default:
                break;
            }
        }
예제 #3
0
        /// <summary>
        /// 获取可用的npc唯一id
        /// </summary>
        uint GetAvailableUUId(Neptune.NPC npcInfo, NpcDefine npcDefine)
        {
            // 普通NPC直接用唯一id加上start id
            uint uuid = (uint)npcInfo.Id + mStartId;

            // 护送NPC逐步递增并取余
            if (npcDefine.Function == NpcDefine.EFunction.ESCORT)
            {
                uuid = mEscortNpcStartID + mEscortNpcIndex % mEscortNpcIDCount;
                ++mEscortNpcIndex;
            }

            return(uuid);
        }
예제 #4
0
        public static NpcDefine MakeNpcDefine(uint npcId)
        {
            if (mNpcDefineCache == null)
            {
                mNpcDefineCache = new Dictionary <uint, NpcDefine>();
                mNpcDefineCache.Clear();
            }
            if (mNpcDefineCache.ContainsKey(npcId) == true)
            {
                return(mNpcDefineCache[npcId]);
            }

            NpcDefine define = new NpcDefine();

            define.NpcId = npcId;

            var dbs = DBManager.Instance.QuerySqliteRow <string>(GlobalConfig.DBFile, "npc", "npc_id", npcId.ToString());

            if (dbs.Count <= 0)
            {
                GameDebug.LogError("Error in MakeNpcDefine, can not find npc data by id " + npcId);
                return(null);
            }

            var dbNpc = dbs[0];

            if (dbNpc.Count <= 0)
            {
                return(null);
            }

            if (dbNpc.Count > 0)
            {
                dbNpc.TryGetValue("idle_ani", out define.IdleAni);
                dbNpc.TryGetValue("const_title", out define.ConstTitle);
                dbNpc.TryGetValue("const_text", out define.ConstText);
                dbNpc.TryGetValue("const_btn_text", out define.ConstBtnText);
                dbNpc.TryGetValue("const_btn_pic", out define.ConstBtnPic);

                string rawData = string.Empty;
                dbNpc.TryGetValue("actor_id", out rawData);
                uint.TryParse(rawData, out define.ActorId);

                dbNpc.TryGetValue("light_mode", out rawData);
                if (string.IsNullOrEmpty(rawData) == true || rawData.Equals("0"))
                {
                    define.LightMode = NpcDefine.ELightMode.ROLE;
                }
                else
                {
                    uint lightModeUint = 0;
                    uint.TryParse(rawData, out lightModeUint);
                    define.LightMode = (NpcDefine.ELightMode)lightModeUint;
                }

                dbNpc.TryGetValue("radius", out rawData);
                float.TryParse(rawData, out define.Radius);

                dbNpc.TryGetValue("function", out rawData);
                define.Function = (NpcDefine.EFunction)System.Enum.Parse(typeof(NpcDefine.EFunction), rawData);

                define.FunctionParams.Clear();
                int  i   = 1;
                bool ret = dbNpc.TryGetValue("param" + i, out rawData);
                while (ret)
                {
                    define.FunctionParams.Add(rawData);

                    ++i;
                    ret = dbNpc.TryGetValue("param" + i, out rawData);
                }

                dbNpc.TryGetValue("voice", out rawData);
                define.VoiceIds = DBTextResource.ParseArrayUint(rawData, ",");
            }


            mNpcDefineCache.Add(npcId, define);
            return(define);
        }