Beispiel #1
0
        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);
        }
Beispiel #2
0
    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;
        }
    }
Beispiel #3
0
        /// <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);
        }
Beispiel #4
0
    private void Awake()
    {
#if !UNITY_EDITOR
        try
        {
#endif

        mCharacter = gameObject.GetComponent <ObjCharacter>();

#if !UNITY_EDITOR
    }

    catch (Exception ex)
    {
        Logger.Error(ex.ToString());
    }
#endif
    }
Beispiel #5
0
    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);
        }
    }
Beispiel #6
0
    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));
        }
    }
Beispiel #7
0
    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);
    }
Beispiel #8
0
    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);
        }
    }
Beispiel #9
0
    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);
    }
Beispiel #10
0
    /// <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);
    }
Beispiel #11
0
    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);
    }
Beispiel #12
0
    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);
            }
        }
    }
Beispiel #13
0
        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);
                        }
                    }
                }
            }
        }
Beispiel #14
0
 public BuffManager(ObjCharacter character)
 {
     mCharacter = character;
 }
Beispiel #15
0
    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);
    }
Beispiel #16
0
 public MoveCommand(ObjCharacter character, Vector3 targetPos, float offset = 0.2f)
 {
     mCharacter   = character;
     mTargetPos   = targetPos;
     mDistanceSqr = offset * offset;
 }
Beispiel #17
0
    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
    }