public void CreateEffect(EffectRecord tableData, ObjCharacter character, Vector3?pos = null, Action <EffectController, ulong> loadOverCallback = null, Action <EffectController, ulong> playOverCallback = null, bool shake = true, bool firstPriority = false) { if (!ShouldShowEffect(character.GetObjId())) { return; } if (character.GetObjType() != OBJ.TYPE.MYPLAYER && mDict.Count > GameSetting.Instance.MaxVisibleModelCount) { return; } var mount = character.GetMountPoint(tableData.MountPoint); if (mount == null && character.GetModel() != null && character.State != ObjState.LoadingResource) { Logger.Warn("因为模型Id={2} 挂载点{0}找不到了,所以特效{1}没有播放。", tableData.MountPoint, tableData.Id, character.ModelId); return; } CreateEffect(tableData, mount, character.TargetDirection, character.GetLayerForEffect(), pos, loadOverCallback, playOverCallback, firstPriority, false, shake); }
public void TargetCharacter(ObjBase obj) { var myself = ObjManager.Instance.MyPlayer; if (myself == obj) { return; } var character = obj as ObjCharacter; if (character == null) { return; } switch (character.GetObjType()) { case OBJ.TYPE.INVALID: break; case OBJ.TYPE.OTHERPLAYER: if (GameSetting.Instance.ShowOtherPlayer) { TargetObj = character; PlayerDataManager.Instance.SetSelectTargetData(TargetObj, 3); EventDispatcher.Instance.DispatchEvent(new UIEvent_MainuiCloseList()); } break; case OBJ.TYPE.NPC: { TargetObj = character; PlayerDataManager.Instance.SetSelectTargetData(TargetObj, 3); EventDispatcher.Instance.DispatchEvent(new UIEvent_MainuiCloseList()); } break; case OBJ.TYPE.RETINUE: break; case OBJ.TYPE.DROPITEM: break; case OBJ.TYPE.AUTOPLAYER: break; case OBJ.TYPE.MYPLAYER: break; case OBJ.TYPE.FAKE_CHARACTER: break; case OBJ.TYPE.ELF: break; default: break; } }
/// <summary> /// 输出成一个objdata用于客户端创建 /// </summary> /// <returns></returns> public ObjData DumpObjData(AutoPlayer _this, ReasonType reason) { var data = ObjCharacter.GetImpl().DumpObjData(_this, reason); data.EquipsModel.AddRange(_this.mLogicData.EquipsModel); //data.PkModel = (int)ePkModel.AutoPlayer; //GetEquipsModel(data.EquipsModel); data.Owner = new Uint64Array(); data.Owner.Items.Add(_this.mLogicData.Id); data.Reborn = _this.mLogicData.Ladder; return(data); }
private void Awake() { #if !UNITY_EDITOR try { #endif mCharacter = gameObject.GetComponent <ObjCharacter>(); #if !UNITY_EDITOR } catch (Exception ex) { Logger.Error(ex.ToString()); } #endif }
public void ShowSelectReminder(ObjCharacter obj, Color col) { if (obj == null || mSelectReminderTrans == null || mSelectReminder == null || obj.CharModelRecord == null) { return; } var trans = obj.transform; mSelectReminderTrans.parent = trans; mSelectReminderTrans.localPosition = new Vector3(0, 0.1f, 0); //mSelectReminderTrans.localRotation = Quaternion.Euler(90,0,0); mSelectReminder.SetColorSize(obj.CharModelRecord.ShadowSize * 1.5f, col); if (mSelectReminderTrans.gameObject.activeSelf == false) { mSelectReminderTrans.gameObject.SetActive(true); } }
private void OnSkillReleaseNetBack(IEvent ievent) { var e = ievent as SkillReleaseNetBack; var skillId = e.SkillId; var tbSkill = Table.GetSkill(skillId); if (e.IsOk) { mLastSkillTime = Time.time; var skillCd = tbSkill.NoMove; mYindaoCharacter = null; if (tbSkill.CastType == 2) { if (tbSkill.CastParam[0] > skillCd) { skillCd = tbSkill.CastParam[0]; //只有极光才有的效果 var targetType = (SkillTargetType)ObjMyPlayer.GetSkillData_Data(tbSkill, eModifySkillType.TargetType); //if (tbSkill.TargetType == 4) if (targetType == SkillTargetType.RECT) { if (GameControl.Instance != null && GameControl.Instance.TargetObj != null) { mYindaoCharacter = GameControl.Instance.TargetObj; } } } } mCommondCdTime = Game.Instance.ServerTime.AddMilliseconds(tbSkill.CommonCd); SetNextLoopTime(Game.Instance.ServerTime.AddMilliseconds(skillCd)); } else { SetNextLoopTime(Game.Instance.ServerTime.AddMilliseconds(100)); } }
public ObjCharacter SelectTargetForSkill(ObjCharacter player, SkillRecord skillRecord) { var skillTargetType = (SkillTargetType)ObjMyPlayer.GetSkillData_Data(skillRecord, eModifySkillType.TargetType); if (GameControl.Instance.TargetObj != null && !GameControl.Instance.TargetObj.Dead && Instance.MyPlayer.IsMyEnemy(GameControl.Instance.TargetObj)) { // 这种技能,只能依靠自动瞄准,如果上一个目标可用,就继续打 if (skillTargetType != SkillTargetType.SECTOR && skillTargetType != SkillTargetType.RECT) { var dist = GameControl.GetSkillReleaseDistance(skillRecord); if (Vector3.Distance(player.Position, GameControl.Instance.TargetObj.Position) < dist) { return(GameControl.Instance.TargetObj); } } else { if (GameSetting.Instance.TargetSelectionAssistant && skillRecord.AutoEnemy == 1) { // 如果需要辅助瞄准,技能配置也需要辅助瞄准,而且上一个目标可用,就继续打它 var dist = GameControl.GetSkillReleaseDistance(skillRecord); if (Vector3.Distance(player.Position, GameControl.Instance.TargetObj.Position) < dist) { return(GameControl.Instance.TargetObj); } } else { // 如果不需要辅助瞄准,技能也配置了不需要辅助瞄准,那就不瞄准了 return(null); } } } ObjCharacter targetObj = null; if (skillTargetType == SkillTargetType.CIRCLE) { // nothing } else if (skillTargetType == SkillTargetType.SECTOR) { if (GameSetting.Instance.TargetSelectionAssistant && skillRecord.AutoEnemy == 1) { targetObj = SelectNearestCharacter(player.Position, character => !character.Dead && player.IsMyEnemy(character), skillRecord.TargetParam[0]); } } else if (skillTargetType == SkillTargetType.RECT) { if (GameSetting.Instance.TargetSelectionAssistant && skillRecord.AutoEnemy == 1) { targetObj = SelectNearestCharacter(player.Position, character => !character.Dead && player.IsMyEnemy(character), skillRecord.TargetParam[1]); } } else if (skillTargetType == SkillTargetType.TARGET_RECT) { targetObj = SelectNearestCharacter(player.Position, character => !character.Dead && player.IsMyEnemy(character)); } else if (skillTargetType == SkillTargetType.TARGET_SECTOR) { targetObj = SelectNearestCharacter(player.Position, character => !character.Dead && player.IsMyEnemy(character)); } else if (skillTargetType == SkillTargetType.SINGLE) { targetObj = SelectNearestCharacter(player.Position, character => !character.Dead && player.IsMyEnemy(character)); } else if (skillTargetType == SkillTargetType.TARGET_CIRCLE) { targetObj = SelectNearestCharacter(player.Position, character => !character.Dead && player.IsMyEnemy(character)); } return(targetObj); }
public ObjCharacter SelectNearestCharacter(Vector3 pos, Func <ObjCharacter, bool> fucn = null, float maxDistance = 30.0f) { if (MyPlayer == null) { return(null); } if (GameControl.Instance.JoyStickPressed) { ObjCharacter character = null; var distance = float.MaxValue; { // foreach(var pair in mObjDict) var __enumerator2 = (mObjDict).GetEnumerator(); while (__enumerator2.MoveNext()) { var pair = __enumerator2.Current; { if (!pair.Value.IsCharacter()) { continue; } if (pair.Value == MyPlayer) { continue; } var temp = pair.Value as ObjCharacter; if (temp.GetObjType() == OBJ.TYPE.NPC) { var tempObj = temp as ObjNPC; if (tempObj == null) { continue; } if (tempObj.TableNPC.Interactive != 1) { continue; } } if (temp.Dead) { continue; } var dist = Vector2.Distance(temp.Position.xz(), MyPlayer.Position.xz()); if (maxDistance > 0 && dist > maxDistance) { continue; } // angle weighted 2 here. var diff = (1.0f - Vector3.Dot((temp.Position - MyPlayer.Position).normalized, MyPlayer.TargetDirection)) * 2 + dist; if (diff > distance) { continue; } if (null != fucn) { if (!fucn(temp)) { continue; } } //增加阻挡判断(如果碰到阻挡,降低阻挡里的物体的权值) NavMeshHit hit; if (NavMesh.Raycast(MyPlayer.Position, temp.Position, out hit, -1)) { if (dist + ObstaclePriority > maxDistance) { continue; } } character = temp; distance = diff; } } } return(character); } else { ObjCharacter character = null; var distance = maxDistance; { // foreach(var pair in mObjDict) var __enumerator3 = (mObjDict).GetEnumerator(); while (__enumerator3.MoveNext()) { var pair = __enumerator3.Current; { if (!pair.Value.IsCharacter()) { continue; } if (pair.Value == MyPlayer) { continue; } var temp = pair.Value as ObjCharacter; if (pair.Value.GetObjType() == OBJ.TYPE.NPC) { if ((temp as ObjNPC).TableNPC.Interactive != 1) { continue; } } var diff = Vector2.Distance(temp.Position.xz(), pos.xz()); if (distance > 0 && diff > distance) { continue; } if (null != fucn) { if (!fucn(temp)) { continue; } } //增加阻挡判断(如果碰到阻挡,降低阻挡里的物体的权值) NavMeshHit hit; if (NavMesh.Raycast(MyPlayer.Position, temp.Position, out hit, -1)) { if (distance > 0 && diff + ObstaclePriority > distance) { continue; } } character = temp; distance = diff; } } } return(character); } }
public bool SelectTarget(GameObject gameObject, int skill = -1) { //null鍒ゆ柇 if (null == gameObject) { return(false); } //鑾峰緱涓昏鑷繁 var myself = ObjManager.Instance.MyPlayer; if (null == myself) { return(false); } //鐩爣寰楁槸涓猳bj var obj = gameObject.GetComponent <ObjBase>(); if (null == obj) { return(false); } if (skill == -1) { TargetCharacter(obj); } //鍋滄褰撳墠鐨勬寚浠? //Executer.Stop(); //璁$畻鑷繁璺濈鐩爣鐨勮窛绂? var distance = Vector3.Distance(obj.Position, myself.Position); //榛樿鎶€鑳? var skillId = skill; if (skillId == -1) { skillId = PlayerDataManager.Instance.GetNormalSkill(); } if (obj.IsCharacter() && myself.IsMyEnemy(obj as ObjCharacter)) { if (obj.GetObjType() == OBJ.TYPE.NPC || obj.GetObjType() == OBJ.TYPE.RETINUE) { //濡傛灉鏄痭pc var npc = obj as ObjNPC; if (npc == null) { return(false); } if (!npc.CanBeInteractive()) { return(false); } } var character = obj as ObjCharacter; if (character.Dead) { return(false); } //瀵瑰叾閲婃斁鎶€鑳? var data = Table.GetSkill(skillId); //鐩爣绫诲瀷 var targetType = (SkillTargetType)ObjMyPlayer.GetSkillData_Data(data, eModifySkillType.TargetType); //涓嶉渶瑕佺洰鏍囩殑鎶€鑳? if (targetType == SkillTargetType.SELF || targetType == SkillTargetType.CIRCLE || targetType == SkillTargetType.SECTOR || targetType == SkillTargetType.RECT) { //浣跨敤鎶€鑳? return(UseSkill(myself.GetObjId(), skillId, character.GetObjId())); } //闇€瑕佺洰鏍囩殑鎶€鑳? if (targetType == SkillTargetType.SINGLE || targetType == SkillTargetType.TARGET_CIRCLE || targetType == SkillTargetType.TARGET_RECT || targetType == SkillTargetType.TARGET_SECTOR) { var maxSkillDistance = GetSkillReleaseDistance(data); if (maxSkillDistance - 0.5 < 0.0f) { maxSkillDistance = 0.5f; } if (distance > maxSkillDistance - 0.5) { //璺濈涓嶅 var offset = maxSkillDistance - 1.0f; if (offset < 0.0f) { offset = 0.1f; } Executer.PushCommand(new MoveCommand(myself, character.Position, offset)); Executer.PushCommand(new AttackCommand(myself.GetObjId(), skillId, character.GetObjId())); } else { TargetObj = character; PlayerDataManager.Instance.SetSelectTargetData(TargetObj, 3); ObjManager.Instance.MyPlayer.FaceTo(character.Position); return(UseSkill(myself.GetObjId(), skillId, character.GetObjId())); } } else { Logger.Error("Unknow skill target type = {0}", targetType); } } else if (obj.GetObjType() == OBJ.TYPE.NPC) { var npc = obj as ObjNPC; if (!npc.CanBeInteractive()) { return(false); } if (npc.TableNPC.NpcType == (int)eNpcType.PickUpNpc) { if (distance > GameSetting.Instance.MaxDistance_NPC) { var command = new MoveCommand(myself, npc.Position, GameSetting.Instance.MaxDistance_NPC); Executer.PushCommand(command); return(false); } else { { if (!IsInit) { Table.ForeachWarFlag(tb => { WarFlagDic.Add(tb.Id, tb.FlagModel); return(true); }); Table.ForeachLode(tb => { if (tb.Id < 100000) { LodeDic.Add(tb.Id, tb.NpcId); } else if (tb.Id >= 100000 && tb.Id <= 100020)//策划指定墓碑使用此区间 { MonumentDic.Add(tb.Id, tb.NpcId); } return(true); }); IsInit = true; } var npcId = npc.TableNPC.Id; if (WarFlagDic.ContainsValue(npcId)) { //战旗 PlayerDataManager.Instance.HoldLode(npcId); return(false); } else if (LodeDic.ContainsValue(npcId)) { //采矿 PlayerDataManager.Instance.CollectLode(npcId); return(false); } else if (MonumentDic.ContainsValue(npcId)) { //祭拜 PlayerDataManager.Instance.WorshipMonument(npcId); return(false); } } EventDispatcher.Instance.DispatchEvent(new PickUpNpc_Event(npc.GetDataId(), npc.GetObjId())); return(false); } } var npcDataId = npc.GetDataId(); if (npcDataId >= 108 && npcDataId <= 110)//判断是否是排行NPC { EventDispatcher.Instance.DispatchEvent(new OnRankNpcClick_Event(npcDataId)); } myself.StopMove(); if (distance <= GameSetting.Instance.MaxDistance_NPC) { if (MissionManager.Instance.OpenMissionByNpcId(npc.GetDataId(), npc.GetObjId())) { npc.DoDialogue(); //TODO if (myself.IsAutoFight()) { myself.LeaveAutoCombat(); } } } else { var command = new MoveCommand(myself, npc.Position, GameSetting.Instance.MaxDistance_NPC); Executer.PushCommand(command); var command1 = new FuncCommand(() => { if (MissionManager.Instance.OpenMissionByNpcId(npc.GetDataId(), npc.GetObjId())) { npc.DoDialogue(); //TODO if (myself.IsAutoFight()) { myself.LeaveAutoCombat(); } } }); Executer.PushCommand(command1); } } else if (obj.GetObjType() == OBJ.TYPE.DROPITEM) { //濡傛灉鏄帀钀界墿鍝? var dropItem = obj as ObjDropItem; myself.StopMove(); var dis = GameSetting.Instance.MaxDistance_DropItem; if (dropItem.mTableData != null && dropItem.mTableData.Type == 300) { dis = GameUtils.AutoPickUpBuffDistance; } if (distance <= dis) { dropItem.Pickup(); } else { var command = new MoveCommand(myself, dropItem.Position, dis); Executer.PushCommand(command); var command1 = new FuncCommand(() => { if (null != dropItem) { dropItem.Pickup(); } }); Executer.PushCommand(command1); } } else if (obj.GetObjType() == OBJ.TYPE.FAKE_CHARACTER) { if (((ObjFakeCharacter)obj).iType == (int)eFakeCharacterTypeDefine.MieShiFakeCharacterType) { EventDispatcher.Instance.DispatchEvent(new ApplyPortraitAward_Event(obj.GetDataId())); } else { if (((ObjFakeCharacter)obj).iType == (int)OBJ.TYPE.FAKE_FIGHTLEADER) { if (GuideTrigger.IsFunctionOpen("BtnRank")) { var e = new Show_UI_Event(UIConfig.RankUI, new RankArguments { RankId = obj.GetObjId() }); EventDispatcher.Instance.DispatchEvent(e); } else { EventDispatcher.Instance.DispatchEvent(new ShowUIHintBoard(1736)); } } else { EventDispatcher.Instance.DispatchEvent(new Show_UI_Event(UIConfig.WorshipFrame)); } } } return(false); }
/// <summary> /// 鏀诲嚮鎸夐挳 /// </summary> /// <param name="skillId">鎶€鑳絀d</param> /// <returns></returns> public bool OnAttackBtnClick(int skillId, bool selectTarget = true) { Logger.Info("OnAttackBtnClick SkillID = " + skillId); PlatformHelper.Event("Skill", "Manual", skillId); var myself = ObjManager.Instance.MyPlayer; //琛ㄦ牸鏁版嵁 var data = Table.GetSkill(skillId); if (data == null) { return(false); } if (selectTarget) { TargetObj = ObjManager.Instance.SelectTargetForSkill(myself, data); } //鐩爣绫诲瀷 var targetType = (SkillTargetType)ObjMyPlayer.GetSkillData_Data(data, eModifySkillType.TargetType); if (targetType == SkillTargetType.SELF || targetType == SkillTargetType.CIRCLE) { return(UseSkill(myself.GetObjId(), skillId)); } if (targetType == SkillTargetType.SECTOR) { var targetObj = TargetObj; if (targetObj != null) { myself.FaceTo(targetObj.Position); return(UseSkill(myself.GetObjId(), skillId, targetObj.GetObjId())); } return(UseSkill(myself.GetObjId(), skillId)); } if (targetType == SkillTargetType.RECT) { var targetObj = TargetObj; if (targetObj != null) { myself.FaceTo(targetObj.Position); return(UseSkill(myself.GetObjId(), skillId)); } return(UseSkill(myself.GetObjId(), skillId)); } if (targetType == SkillTargetType.SINGLE || targetType == SkillTargetType.TARGET_CIRCLE || targetType == SkillTargetType.TARGET_RECT || targetType == SkillTargetType.TARGET_SECTOR) { var targetObj = TargetObj; if (targetObj == null || targetObj.Dead) { targetObj = ObjManager.Instance.SelectNearestCharacter(ObjManager.Instance.MyPlayer.Position, character => !character.Dead && ObjManager.Instance.MyPlayer.IsMyEnemy(character)); } if (null == targetObj || targetObj.Dead) { EventDispatcher.Instance.DispatchEvent(new ShowUIHintBoard(713)); return(false); } return(SelectTarget(targetObj.gameObject, skillId)); } Logger.Info("Unknow target type[{0}]", targetType); return(false); }
public void NotifyUseSkill(CharacterUseSkillMsg msg) { if (ObjManager.Instance == null) { Logger.Log2Bugly(" ObjManager.Instance =null"); return; } if (msg == null || msg.Pos == null || msg.Pos.Pos == null) { Logger.Log2Bugly("NotifyUseSkill msg =null"); return; } var chararcter = ObjManager.Instance.FindCharacterById(msg.CharacterId); if (null == chararcter) { Logger.Warn("NotifyUseSkill Cannot find obj[{0}]", msg.CharacterId); return; } if (chararcter.Dead) { return; } //放技能时的坐标 var p = GameLogic.GetTerrainPosition(GameUtils.DividePrecision(msg.Pos.Pos.x), GameUtils.DividePrecision(msg.Pos.Pos.y)); //放技能时的朝向 var dir = new Vector3(GameUtils.DividePrecision(msg.Pos.Dir.x), 0, GameUtils.DividePrecision(msg.Pos.Dir.y)); //如果距离差距过大就直接拉过来 var diff = (chararcter.Position.xz() - p.xz()).magnitude; ObjCharacter mainTargetCharacter = null; if (chararcter.GetObjType() == OBJ.TYPE.MYPLAYER) { PlatformHelper.Event("Skill", "Auto", msg.SkillId); //调整位置 if (diff > GameSetting.Instance.MainPlayerSkillPosErrorDistance) { chararcter.Position = p; } //调整朝向 chararcter.TargetDirection = dir; { var __list1 = msg.TargetObjId; var __listCount1 = __list1.Count; for (var __i1 = 0; __i1 < __listCount1; ++__i1) { var id = __list1[__i1]; { var target = ObjManager.Instance.FindCharacterById(id); if (null != target) { mainTargetCharacter = target; break; } } } } } else { if (chararcter.GetObjType() == OBJ.TYPE.OTHERPLAYER) { if (diff > GameSetting.Instance.OtherPlayerSkillPosErrorDistance) { chararcter.Position = p; } } else { if (diff > GameSetting.Instance.NPCSkillPosErrorDistance) { chararcter.DelayedMove = p; } } var adjustDir = false; { var __list2 = msg.TargetObjId; var __listCount2 = __list2.Count; for (var __i2 = 0; __i2 < __listCount2; ++__i2) { var id = __list2[__i2]; { var target = ObjManager.Instance.FindCharacterById(id); if (null != target) { mainTargetCharacter = target; chararcter.Target = target; if (chararcter.GetObjType() == OBJ.TYPE.NPC) { if (((ObjNPC)chararcter).TowardPlayer) { chararcter.FaceTo(target.Position); } } else { chararcter.FaceTo(target.Position); } adjustDir = true; break; } } } } if (!adjustDir) { chararcter.TargetDirection = dir; } } var skillData = Table.GetSkill(msg.SkillId); if (null == skillData) { Logger.Fatal("Can't find skill[{0}]", msg.SkillId); return; } //放技能 chararcter.UseSkill(skillData, msg.TargetObjId); if (chararcter.GetObjType() == OBJ.TYPE.MYPLAYER) { var e = new SkillReleaseNetBack(skillData.Id, true); EventDispatcher.Instance.DispatchEvent(e); } if (ObjManager.Instance.MyPlayer == null) { Logger.Log2Bugly("ObjManager.Instance.MyPlayer == null"); return; } if (msg.CharacterId != ObjManager.Instance.MyPlayer.GetObjId() && msg.TargetObjId.Contains(ObjManager.Instance.MyPlayer.GetObjId())) { PlayerDataManager.Instance.SetSelectTargetData(chararcter, 1); } if (msg.CharacterId == ObjManager.Instance.MyPlayer.GetObjId() && ObjManager.Instance.MyPlayer != mainTargetCharacter && mainTargetCharacter != null && mainTargetCharacter.Dead == false) { PlayerDataManager.Instance.SetSelectTargetData(mainTargetCharacter, 2); } //Logger.Info("NotifyUseSkill Obj[{0}] skill[{1}]", msg.CharacterId, msg.SkillId); }
private void ShowSkillIndicator(BuffResult buff, ObjCharacter character) { var skillId = buff.Param[0]; var data = Table.GetSkill(skillId); if (data == null) { Logger.Log2Bugly("ShowSkillIndicator data =null"); return; } if (GameLogic.Instance == null || GameLogic.Instance.Scene == null) { Logger.Log2Bugly("ShowSkillIndicator GameLogic.Instance =null"); return; } //SkillTargetType targetType = (SkillTargetType)data.TargetType; var targetType = (SkillTargetType)ObjMyPlayer.GetSkillData_Data(data, eModifySkillType.TargetType); if (targetType == SkillTargetType.CIRCLE) { // correct the direction of npc or monster. character.TargetDirection = new Vector3(buff.Param[3] / 1000.0f, 0, buff.Param[4] / 1000.0f); var para0 = ObjMyPlayer.GetSkillData_Data(data, eModifySkillType.TargetParam1); GameLogic.Instance.Scene.CreateSkillRangeIndicator(character.gameObject, Scene.SkillRangeIndicatorType.Circle, para0, 0, Color.red, (caster, receiver) => { StartCoroutine(WaitToDoSomething(TimeSpan.FromMilliseconds(buff.Param[5]), () => { Destroy(caster); Destroy(receiver); })); }, true); } else if (targetType == SkillTargetType.SECTOR || targetType == SkillTargetType.TARGET_SECTOR) { // correct the direction of npc or monster. character.TargetDirection = new Vector3(buff.Param[3] / 1000.0f, 0, buff.Param[4] / 1000.0f); GameLogic.Instance.Scene.CreateSkillRangeIndicator(character.gameObject, Scene.SkillRangeIndicatorType.Fan, data.TargetParam[0], data.TargetParam[1], Color.red, (caster, receiver) => { StartCoroutine(WaitToDoSomething(TimeSpan.FromMilliseconds(buff.Param[5]), () => { Destroy(caster); Destroy(receiver); })); }, true); } else if (targetType == SkillTargetType.RECT || targetType == SkillTargetType.TARGET_RECT) { // correct the direction of npc or monster. character.TargetDirection = new Vector3(buff.Param[3] / 1000.0f, 0, buff.Param[4] / 1000.0f); GameLogic.Instance.Scene.CreateSkillRangeIndicator(character.gameObject, Scene.SkillRangeIndicatorType.Rectangle, data.TargetParam[0], data.TargetParam[1], Color.red, (caster, receiver) => { StartCoroutine(WaitToDoSomething(TimeSpan.FromMilliseconds(buff.Param[5]), () => { Destroy(caster); Destroy(receiver); })); }, true); } else if (targetType == SkillTargetType.SINGLE || targetType == SkillTargetType.TARGET_CIRCLE) { var x = buff.Param[1] / 100.0f; var z = buff.Param[2] / 100.0f; var y = GameLogic.GetTerrainHeight(x, z); var o = new GameObject(); var objTransform = o.transform; objTransform.parent = GameLogic.Instance.Scene.GlobalSkillIndicatorRoot.transform; objTransform.position = new Vector3(x, y, z); objTransform.forward = new Vector3(buff.Param[3] / 1000.0f, 0, buff.Param[4] / 1000.0f); if (targetType == SkillTargetType.TARGET_CIRCLE) { GameLogic.Instance.Scene.CreateSkillRangeIndicator(o, Scene.SkillRangeIndicatorType.Circle, data.TargetParam[0], 0, Color.red, (caster, receiver) => { StartCoroutine(WaitToDoSomething(TimeSpan.FromMilliseconds(buff.Param[5]), () => { Destroy(o); })); }, true); } else if (targetType == SkillTargetType.TARGET_SECTOR) { GameLogic.Instance.Scene.CreateSkillRangeIndicator(o, Scene.SkillRangeIndicatorType.Fan, data.TargetParam[0], data.TargetParam[1], Color.red, (caster, receiver) => { var casterTransform = caster.transform; casterTransform.position = new Vector3(x, y, z); casterTransform.forward = new Vector3(buff.Param[3] / 1000.0f, 0, buff.Param[4] / 1000.0f); StartCoroutine(WaitToDoSomething(TimeSpan.FromMilliseconds(buff.Param[5]), () => { Destroy(o); })); }, true); } else if (targetType == SkillTargetType.TARGET_RECT) { GameLogic.Instance.Scene.CreateSkillRangeIndicator(o, Scene.SkillRangeIndicatorType.Rectangle, data.TargetParam[0], data.TargetParam[1], Color.red, (caster, receiver) => { var casterTransform = caster.transform; casterTransform.position = new Vector3(x, y, z); casterTransform.forward = new Vector3(buff.Param[3] / 1000.0f, 0, buff.Param[4] / 1000.0f); StartCoroutine(WaitToDoSomething(TimeSpan.FromMilliseconds(buff.Param[5]), () => { Destroy(o); })); }, true); } } }
void InitModel() { if (msgR == null) { return; } if (msgR.bosDie == false) { CreateMinimapCharacter(new Vector3(msgR.PosX, 0, msgR.PosZ), 2, 10000000, -1); } else { RemoveMinimapCharacter(10000000); } DataModel.CharaModels.Clear(); for (int i = 0; i < dataModelsList.Count; i++) { RemoveMinimapCharacter(dataModelsList[i].CharacterId); } dataModelsList.Clear(); if (msgR.RankList != null) { ulong enemyId = 0; for (int i = 0; i < msgR.RankList.Count; i++) { if (msgR.RankList[i] == null) { continue; } if (msgR.RankList[i].Guid == ObjManager.Instance.MyPlayer.GetObjId()) { enemyId = msgR.RankList[i].EnemyGuid; break; } } for (int i = 0; i < msgR.RankList.Count; i++) { if (msgR.RankList[i] == null) { continue; } if (msgR.RankList[i].Guid == ObjManager.Instance.MyPlayer.GetObjId()) { continue; } /*** if (i == 0) //魔王 * { * CreateMinimapCharacter(new Vector3(msgR.RankList[i].PosX, 0, msgR.RankList[i].PosZ), 3,msgR.RankList[i].Guid, -1); * } * else//玩家自己 * { * CreateMinimapCharacter(new Vector3(msgR.RankList[i].PosX, 0, msgR.RankList[i].PosZ), 0,msgR.RankList[i].Guid, -1); * } ***/ ObjCharacter character = ObjManager.Instance.FindCharacterById(msgR.RankList[i].Guid); if (character != null) { msgR.RankList[i].PosX = character.Position.x; msgR.RankList[i].PosZ = character.Position.z; } if (i == 0) //魔王 { CreateMinimapCharacter(new Vector3(msgR.RankList[i].PosX, 0, msgR.RankList[i].PosZ), 3, msgR.RankList[i].Guid, -1); } else { if (msgR.RankList[i].Guid == enemyId) { CreateMinimapCharacter(new Vector3(msgR.RankList[i].PosX, 0, msgR.RankList[i].PosZ), 1, msgR.RankList[i].Guid, -1); } else { CreateMinimapCharacter(new Vector3(msgR.RankList[i].PosX, 0, msgR.RankList[i].PosZ), 0, msgR.RankList[i].Guid, -1); } } } } }
public BuffManager(ObjCharacter character) { mCharacter = character; }
public bool SelectTarget(GameObject gameObject, int skill = -1) { //null判断 if (null == gameObject) { return(false); } //获得主角自己 var myself = ObjManager.Instance.MyPlayer; if (null == myself) { return(false); } //目标得是个obj var obj = gameObject.GetComponent <ObjBase>(); if (null == obj) { return(false); } if (skill == -1) { TargetCharacter(obj); } //停止当前的指�? //Executer.Stop(); //计算自己距离目标的距�? var distance = Vector3.Distance(obj.Position, myself.Position); //默认技�? var skillId = skill; if (skillId == -1) { skillId = PlayerDataManager.Instance.GetNormalSkill(); } if (obj.IsCharacter() && myself.IsMyEnemy(obj as ObjCharacter)) { if (obj.GetObjType() == OBJ.TYPE.NPC || obj.GetObjType() == OBJ.TYPE.RETINUE) { //如果是npc var npc = obj as ObjNPC; if (npc == null) { return(false); } if (!npc.CanBeInteractive()) { return(false); } } var character = obj as ObjCharacter; if (character.Dead) { return(false); } //对其释放技�? var data = Table.GetSkill(skillId); //目标类型 var targetType = (SkillTargetType)ObjMyPlayer.GetSkillData_Data(data, eModifySkillType.TargetType); //不需要目标的技�? if (targetType == SkillTargetType.SELF || targetType == SkillTargetType.CIRCLE || targetType == SkillTargetType.SECTOR || targetType == SkillTargetType.RECT) { //使用技�? return(UseSkill(myself.GetObjId(), skillId, character.GetObjId())); } //需要目标的技�? if (targetType == SkillTargetType.SINGLE || targetType == SkillTargetType.TARGET_CIRCLE || targetType == SkillTargetType.TARGET_RECT || targetType == SkillTargetType.TARGET_SECTOR) { var maxSkillDistance = GetSkillReleaseDistance(data); if (maxSkillDistance - 0.5 < 0.0f) { maxSkillDistance = 0.5f; } if (distance > maxSkillDistance - 0.5) { //距离不够 var offset = maxSkillDistance - 1.0f; if (offset < 0.0f) { offset = 0.1f; } Executer.PushCommand(new MoveCommand(myself, character.Position, offset)); Executer.PushCommand(new AttackCommand(myself.GetObjId(), skillId, character.GetObjId())); } else { TargetObj = character; PlayerDataManager.Instance.SetSelectTargetData(TargetObj, 3); ObjManager.Instance.MyPlayer.FaceTo(character.Position); return(UseSkill(myself.GetObjId(), skillId, character.GetObjId())); } } else { Logger.Error("Unknow skill target type = {0}", targetType); } } else if (obj.GetObjType() == OBJ.TYPE.NPC) { var npc = obj as ObjNPC; if (!npc.CanBeInteractive()) { return(false); } if (npc.TableNPC.NpcType == (int)eNpcType.PickUpNpc) { EventDispatcher.Instance.DispatchEvent(new PickUpNpc_Event(npc.GetDataId(), npc.GetObjId())); return(false); } myself.StopMove(); if (distance <= GameSetting.Instance.MaxDistance_NPC) { if (MissionManager.Instance.OpenMissionByNpcId(npc.GetDataId(), npc.GetObjId())) { npc.DoDialogue(); //TODO if (myself.IsAutoFight()) { myself.LeaveAutoCombat(); } } } else { var command = new MoveCommand(myself, npc.Position, GameSetting.Instance.MaxDistance_NPC); Executer.PushCommand(command); var command1 = new FuncCommand(() => { if (MissionManager.Instance.OpenMissionByNpcId(npc.GetDataId(), npc.GetObjId())) { npc.DoDialogue(); //TODO if (myself.IsAutoFight()) { myself.LeaveAutoCombat(); } } }); Executer.PushCommand(command1); } } else if (obj.GetObjType() == OBJ.TYPE.DROPITEM) { //如果是掉落物�? var dropItem = obj as ObjDropItem; myself.StopMove(); if (distance <= GameSetting.Instance.MaxDistance_DropItem) { dropItem.Pickup(); } else { var command = new MoveCommand(myself, dropItem.Position, GameSetting.Instance.MaxDistance_DropItem); Executer.PushCommand(command); var command1 = new FuncCommand(() => { if (null != dropItem) { dropItem.Pickup(); } }); Executer.PushCommand(command1); } } else if (obj.GetObjType() == OBJ.TYPE.FAKE_CHARACTER) { if (((ObjFakeCharacter)obj).iType == (int)eFakeCharacterTypeDefine.MieShiFakeCharacterType) { EventDispatcher.Instance.DispatchEvent(new ApplyPortraitAward_Event(obj.GetDataId())); } else { EventDispatcher.Instance.DispatchEvent(new Show_UI_Event(UIConfig.WorshipFrame)); } } return(false); }
public MoveCommand(ObjCharacter character, Vector3 targetPos, float offset = 0.2f) { mCharacter = character; mTargetPos = targetPos; mDistanceSqr = offset * offset; }
private void LateUpdate() { #if !UNITY_EDITOR try { #endif if (0 == Time.frameCount % 2) { if (mLoopState != AUTO_STAT.AUTO_STAT_COMMIT_MMISSION && mLoopState != AUTO_STAT.AUTO_STAT_PICK_DROP && CheckMission()) { MissionComple(); CommitMission(); } else { if (IsAutoMission() == false && mLoopState != AUTO_STAT.AUTO_STAT_PICK_DROP) { if (Time.realtimeSinceStartup - mAutoPickTimer > 120.0f) { CommitMission(); } } switch (mLoopState) { case AUTO_STAT.AUTO_STAT_SKILL_CD_NOMOVE: //放技能的CD,no move { if (Game.Instance.ServerTime > mNextUpdataTime) { AutoFight(); } else if (mYindaoCharacter != null) { if (mYindaoCharacter.Dead) { var ret = SerchNearObj(); ObjCharacter targetObj = null; if (ret != null && ret.IsCharacter()) { targetObj = ret as ObjCharacter; } if (targetObj == null) { mYindaoCharacter = null; } else { GameControl.Instance.TargetObj = targetObj; MainPlayer.FaceTo(targetObj.Position); MainPlayer.SendDirToServer(true); mYindaoCharacter = targetObj; } } } } break; case AUTO_STAT.AUTO_STAT_MOVE_TARGET: //向目标移动 { var moveLength = GetSkillMoveDisance(); var skillLength = GetSkillCastDisance(); if (GameControl.Instance.TargetObj) { mTargetPostion = GameControl.Instance.TargetObj.Position; } var dis = GameUtils.Vector3PlaneDistance(MainPlayer.Position, mTargetPostion); if (skillLength <= 0.5f || dis < skillLength) { AutoFight(); } else { var ret = MainPlayer.MoveTo(mTargetPostion, moveLength - 0.1f, false); if (ret == false) { GameControl.Instance.TargetObj = null; AutoFight(); } } } break; case AUTO_STAT.AUTO_STAT_COMMIT_MMISSION: { CommitMission(); } break; case AUTO_STAT.AUTO_STAT_MOVE_DROPITEM: { //向掉落物移动 var dif = GameUtils.AutoPickUpDistance - 0.5f; if (dif < 0.0f) { dif = 0.5f; } var dis = GameUtils.Vector3PlaneDistance(MainPlayer.Position, mTargetPostion); if (dis < dif) { AutoFight(); } else { var ret = MainPlayer.MoveTo(mTargetPostion, dif - 0.3f); if (ret == false) { GameControl.Instance.TargetObj = null; AutoFight(); } } } break; case AUTO_STAT.AUTO_STAT_MOVE_POSITION: { //向指定目的地移动 var dif = 0.05; var dis = GameUtils.Vector3PlaneDistance(MainPlayer.Position, mTargetPostion); if (dis < dif) { AutoFight(); } else { var ret = MainPlayer.MoveTo(mTargetPostion, 0.05f); if (ret == false) { GameControl.Instance.TargetObj = null; AutoFight(); } } } break; case AUTO_STAT.AUTO_STAT_SKILL_CD: //放技能的CD,Common Cd { if (Game.Instance.ServerTime > mNextUpdataTime) { AutoFight(); } } break; case AUTO_STAT.AUTO_STAT_WAIT_FUBEN: { //向副本点等待 if (Game.Instance.ServerTime > mNextUpdataTime) { MovePostion(); MainPlayer.MoveTo(mTargetPostion, 0.1f); } } break; case AUTO_STAT.AUTO_STAT_PICK_DROP: { //阶段性战斗完成后拾取物品,完成后继续之前的状态 PickUpLogic(); } break; default: { CancelLoop(); } break; } } } #if !UNITY_EDITOR } catch (Exception ex) { Logger.Error(ex.ToString()); } #endif }