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); }
/// <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; } }
/// <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); }
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); }