Beispiel #1
0
        //在地图中增加怪物并初始化怪物的基础数据
        public void AddMonInMap(List <PMapMon> monList)
        {
            uint mapId = MeVo.instance.mapId;

            foreach (PMapMon monIn in monList)
            {
                bool         isNew     = false;
                SysMonsterVo monsterVo = null;
                MonsterVo    enemyVo   = null;

                enemyVo = MonsterMgr.Instance.GetMonster(mapId.ToString(), monIn.id.ToString());
                if (enemyVo == null)
                {
                    isNew   = true;
                    enemyVo = new MonsterVo();
                }
                enemyVo.mapId     = mapId;
                enemyVo.Id        = monIn.id;
                enemyVo.monsterId = monIn.monid;
                //enemyVo.monsterId = 100001;
                enemyVo.bornType = monIn.born;
                //enemyVo.bornType = 2;
                enemyVo.CurHp = monIn.hp;
                enemyVo.Hp    = monIn.hpFull;

                //分割线,下面这些数据不是服务器传的,通过读表赋值
                monsterVo = enemyVo.MonsterVO;
                if (monsterVo == null)
                {
                    Log.info(this, "数据库没这个怪物的信息");
                    continue;
                }
                enemyVo.Name           = monsterVo.name;
                enemyVo.AttMMax        = (uint)monsterVo.att_m_max;
                enemyVo.AttMMin        = (uint)monsterVo.att_m_min;
                enemyVo.AttPMin        = (uint)monsterVo.att_p_min;
                enemyVo.AttPMax        = (uint)monsterVo.att_p_max;
                enemyVo.DefM           = (uint)monsterVo.def_m;
                enemyVo.DefP           = (uint)monsterVo.def_p;
                enemyVo.Hit            = (uint)monsterVo.hit;
                enemyVo.Dodge          = monsterVo.dodge;
                enemyVo.Crit           = (uint)monsterVo.crit;
                enemyVo.CritRatio      = (uint)monsterVo.crit_ratio;
                enemyVo.Flex           = (uint)monsterVo.flex;
                enemyVo.HurtRe         = (uint)monsterVo.hurt_re;
                enemyVo.HurtResist     = (uint)monsterVo.hurt_resist;
                enemyVo.HurtDownResist = (uint)monsterVo.hurt_down_resist;
                enemyVo.MoveRatio      = monsterVo.move_ratio * 0.001f;
                enemyVo.job            = GameConst.JOB_MON; //给job赋值,战斗公式会用到
                enemyVo.Level          = monsterVo.lvl;
                enemyVo = MonsterAdapt(enemyVo);            //根据场景修改怪物属性

                if (isNew)
                {
                    UnityEngine.Debug.Log("****AddMonInMap(), 在地图中增加怪物并初始化怪物的基础数据!id, monId = " + enemyVo.Id + ", " + enemyVo.monsterId);
                    Log.info(this, "这是个新怪物,加到怪物管理中去!");
                    MonsterMgr.Instance.addMonster(mapId.ToString(), enemyVo);
                }
            }
        }
Beispiel #2
0
        private void UpdateMonsterHpInfo()
        {
            MonsterVo boss = MonsterMgr.Instance.BossVo;

            if (boss == null || boss.CurHp == 0)
            {
                _sldBossHp.gameObject.SetActive(false);
                _sldMonsterHp.gameObject.SetActive(false);
            }
            else
            {
                int count     = boss.MonsterVO.hp_count;
                int perValue  = Mathf.CeilToInt((float)boss.Hp / count);
                int leftCount = (int)boss.CurHp / perValue;
                var left      = (int)(boss.CurHp % perValue);
                var last      = (int)(boss.lastHp % perValue);
                if (left != 0)
                {
                    leftCount = leftCount + 1;
                }
                _sldBossHp.gameObject.SetActive(true);
                string hpStr    = boss.CurHp + "/" + boss.Hp;
                float  rate     = (float)left / perValue;
                float  lastRate = (float)last / perValue;
                if (boss.CurHp == boss.Hp)
                {
                    rate     = 1;
                    lastRate = 1;
                }
                _sldBossHp.SetValue(boss.MonsterVO.name, hpStr, rate, lastRate, leftCount, boss.Level);
            }
        }
Beispiel #3
0
 // Use this for initialization
 void Start()
 {
     monsterModel = MonsterModel.GetInstance();
     enemy        = Resources.Load("goblinGuard") as GameObject;
     monsterVo    = monsterModel.monsterList[2];
     SpawnMonster();
 }
 // Use this for initialization
 void Start()
 {
     monsterModel = MonsterModel.GetInstance();
     enemy        = Resources.Load("orcWarrior") as GameObject;
     monsterVo    = monsterModel.monsterList[1];
     SpawnMonster();
 }
Beispiel #5
0
        /**放入队列**/

        public void addMonster(string mapId, MonsterVo vo)
        {
            if (vo == null)
            {
                return;
            }
            if (StringUtils.isEmpty(mapId))
            {
                return;
            }
            IList <MonsterVo> list = null;

            if (_monsterVoList.ContainsKey(mapId))
            {
                list = _monsterVoList[mapId];
            }
            else
            {
                list = new List <MonsterVo>();
                _monsterVoList.Add(mapId, list);
            }
            list.Add(vo);
            if (vo.MonsterVO.quality == 3)
            {
                BossVo = vo;
            }
            LiveMonsterNumber++;
        }
Beispiel #6
0
        private MonsterVo MonsterAdapt(MonsterVo enemyVo)
        {
            SysMapVo mapVo = BaseDataMgr.instance.GetMapVo(MeVo.instance.mapId);

            if (mapVo.adapt)
            {
                enemyVo.Level = MeVo.instance.Level;
#if false
                float zoomFactor            = 10000f;
                SysMonsterAdaptRuleVo adapt = BaseDataMgr.instance.GetMonsterAdapt((uint)MeVo.instance.Level);
                enemyVo.Level     = MeVo.instance.Level;
                enemyVo.CurHp     = (uint)(enemyVo.CurHp * adapt.hp_ratio / zoomFactor);
                enemyVo.Hp        = (uint)(enemyVo.Hp * adapt.hp_ratio / zoomFactor);
                enemyVo.AttMMax   = (uint)(enemyVo.AttMMax * adapt.att_m_max_ratio / zoomFactor);
                enemyVo.AttMMin   = (uint)(enemyVo.AttMMin * adapt.att_m_min_ratio / zoomFactor);
                enemyVo.AttPMin   = (uint)(enemyVo.AttPMin * adapt.att_p_min_ratio / zoomFactor);
                enemyVo.AttPMax   = (uint)(enemyVo.AttPMax * adapt.att_p_max_ratio / zoomFactor);
                enemyVo.DefM      = (uint)(enemyVo.DefM * adapt.def_m_ratio / zoomFactor);
                enemyVo.DefP      = (uint)(enemyVo.DefP * adapt.def_p_ratio / zoomFactor);
                enemyVo.Hit       = (uint)(enemyVo.Hit * adapt.hit_ratio / zoomFactor);
                enemyVo.Dodge     = (int)(enemyVo.Dodge * adapt.dodge_ratio / zoomFactor);
                enemyVo.Crit      = (uint)(enemyVo.Crit * adapt.crit_lvl_ratio / zoomFactor);
                enemyVo.CritRatio = (uint)(enemyVo.CritRatio * adapt.crit_hurt_ratio / zoomFactor);
                enemyVo.Flex      = (uint)(enemyVo.Flex * adapt.flex_ratio / zoomFactor);
                enemyVo.HurtRe    = (uint)(enemyVo.HurtRe * adapt.hurt_re_ratio / zoomFactor);
#endif
            }

            return(enemyVo);
        }
Beispiel #7
0
        private void Start()
        {
            _meEnemyVo     = MeController.Me.GetVo() as MonsterVo;
            BaseRoleVo     = _meEnemyVo;
            _selfTransform = MeController.transform;

            aiCtr = new Ai((MeController.Me as MonsterDisplay).listAiDataCtr);
            aiCtr.checkHp(0, 100); // 具体的AI行为
        }
Beispiel #8
0
        private bool HpChangeMatch()
        {
            bool comparatorInvalid = (null == hpComparator || string.Empty == hpComparator);
            bool valueInvalid      = (null == hpValue || string.Empty == hpValue);

            if (comparatorInvalid || valueInvalid)
            {
                return(true);
            }

            uint curHp  = MeVo.instance.CurHp;
            uint goalHp = Convert.ToUInt32(hpValue);

            if (RoleType.Equals(StoryConst.MONSTER))
            {
                MonsterVo monsterVo = MonsterMgr.Instance.GetMonsterWithConfigId(Id);
                if (null != monsterVo)
                {
                    curHp = monsterVo.CurHp;
                }
                else
                {
                    return(false);
                }
            }

            //比较
            if (">" == hpComparator)
            {
                return(curHp > goalHp);
            }
            else if ("<" == hpComparator)
            {
                return(curHp < goalHp);
            }
            else if (">=" == hpComparator)
            {
                return(curHp >= goalHp);
            }
            else if ("<=" == hpComparator)
            {
                return(curHp <= goalHp);
            }
            else if ("=" == hpComparator)
            {
                return(curHp == goalHp);
            }
            else
            {
                return(false);
            }
        }
Beispiel #9
0
    void OnXmlLoadEnemy()
    {
        XmlDocument xmlDoc = new XmlDocument();

        xmlDoc.LoadXml(xmlEnemy.text);
        XmlNodeList list = xmlDoc.SelectSingleNode("root").ChildNodes;

        for (int i = 0; i < list.Count; i++)
        {
            MonsterVo monsterVo = new MonsterVo();
            monsterVo.SetData(list[i] as XmlElement);
            monsterModel.monsterList.Add(monsterVo);
        }
    }
Beispiel #10
0
        private void CreateMonster()
        {
            MonsterVo monsterVo = new MonsterVo();

            monsterVo.monsterId         = Convert.ToUInt32(resourceId);
            monsterId                   = monsterVo.monsterId * 10 + monsterCreatedNo;
            monsterVo.Id                = monsterId;
            monsterVo.Name              = resourceType + "_" + resourceId;
            monsterVo.X                 = targetX;
            monsterVo.Y                 = targetY;
            monsterVo.CurHp             = 100000;
            monsterVo.ModelLoadCallBack = LoadMonsterCallback;
            AppMap.Instance.CreateMonster(monsterVo);
            monsterCreatedNo++;
        }
Beispiel #11
0
 protected override void CheckDeath()
 {
     base.CheckDeath();
     if (MeBaseRoleVo.CurHp <= 0 && MeController.StatuController.CurrentStatu != Status.DEATH)
     {
         MeController.StatuController.SetStatu(Status.DEATH);
         MeController.GraspThrowController.InterceptGrasp(true);
         MonsterVo monsterVo = (MeController.Me.GetVo() as MonsterVo);
         if (3 == monsterVo.MonsterVO.quality && !speechPlaying)
         {
             speechPlaying = true;
             SpeechMgr.Instance.PlayKillBossSpeech();
         }
     }
 }
Beispiel #12
0
        /**根据怪物UID取得怪物(主要用于任务寻路)**/
        public MonsterDisplay getMonsterWithUid(string uid)
        {
            if (StringUtils.isEmpty(uid))
            {
                return(null);
            }
            MonsterVo enemyVo           = null;
            IList <MonsterDisplay> list = AppMap.Instance.monsterList;

            foreach (MonsterDisplay display in list)
            {
                enemyVo = (MonsterVo)display.GetVo();
                if (enemyVo.monsterId.Equals(uid))
                {
                    return(display);
                }
            }
            return(null);
        }
Beispiel #13
0
        /**移除怪物**/

        public void RemoveMonster(string id)
        {
            if (StringUtils.isEmpty(id))
            {
                return;
            }
            String mapId = AppMap.Instance.mapParser.MapId.ToString();
            //底层移除怪物display列表中对应id的信息
            MonsterDisplay monsterDisp = AppMap.Instance.GetMonster(id);

            //还原Boss脚底Buff特效
            if (MonsterType.TypeBoss == monsterDisp.MonsterVo.quality)
            {
                RemoveFootEffect();
            }
            AppMap.Instance.remove(monsterDisp);

            //移除怪物vo信息
            IList <MonsterVo> list = _monsterVoList.ContainsKey(mapId) ? _monsterVoList[mapId] : null;

            if (list == null)
            {
                return;
            }
            foreach (MonsterVo item in list)
            {
                if (item.Id.Equals(id))
                {
                    if (item.MonsterVO.quality == 3)
                    {
                        BossVo = null;
                    }
                    list.Remove(item);
                    break;
                }
            }
            BattleMode.Instance.DoMonsterDeath(); // 给服务器发送通知
        }
Beispiel #14
0
 public void GetEnemyInfo(MonsterVo _monsterVo)
 {
     monsterVo = _monsterVo;
 }
 // Use this for initialization
 private void Start()
 {
     _meEnemyVo     = MeController.Me.GetVo() as MonsterVo;
     BaseRoleVo     = _meEnemyVo;
     _selfTransform = MeController.transform;
 }
Beispiel #16
0
        /// <summary>
        ///     怪物攻击受击目标检测(只对自己的客户端检测)
        /// </summary>
        /// <param name="atker">攻击者</param>
        /// <param name="skillVo">技能VO</param>
        /// <param name="effectPos">施法点,怪物位置或远程施法点</param>
        /// <param name="ownerPos">施法点,怪物位置或远程施法点</param>
        /// <param name="dir">施法方向</param>
        /// <param name="monsterVo">怪物VO</param>
        /// <param name="isSend">是否同步给服务器</param>
        public bool MonsterCheckInjured2D(BaseControler atker, SysSkillBaseVo skillVo, Vector3 effectPos, Vector3 ownerPos, int dir,
                                          MonsterVo monsterVo, int index,
                                          bool isSend = false)
        {
            if (AppMap.Instance.me == null || AppMap.Instance.me.GetVo().CurHp <= 0)
            {
                return(false);
            }
            if (monsterVo.CurHp <= 0)
            {
                return(false);                      //如果检测时当前怪物的血量已经为0,则玩家忽略当前怪物的攻击
            }
            var meVo = AppMap.Instance.me.GetMeVoByType <PlayerVo>();

            if (MeVo.instance.mapId == MapTypeConst.WORLD_BOSS)
            {
                if (AppMap.Instance.me.Controller.transform.position.x > 7)
                {
                    meVo.CurHp = 0;
                    var attackVo = new ActionVo();
                    attackVo.ActionType = Actions.DEATH;
                    meControler.AttackController.AddAttackList(attackVo, true);
                    return(true);
                }
                return(false);
            }

            Vector3       target             = AppMap.Instance.me.Controller.transform.position; //敌方位置
            bool          isDodge            = false;                                            //是否闪避
            bool          isCrit             = false;                                            //是否暴击
            bool          isParry            = false;                                            //是否格挡
            BoxCollider2D myBoxCollider2D    = (meControler.Me as ActionDisplay).BoxCollider2D;
            BoxCollider2D enemyBoxCollider2D = AppMap.Instance.me.BoxCollider2D;

            if (IsSkillCovered(skillVo, effectPos, ownerPos, target, dir, myBoxCollider2D, enemyBoxCollider2D))
            {
                if (!isSend)
                {
                    int  damageVal;
                    uint damageType;
                    uint stateType;
                    if (meVo != null &&
                        (meVo.IsUnbeatable || AppMap.Instance.me.Controller.StatuController.CurrentStatu == Status.ROLL))
                    {
                        return(false); //无敌状态不播放受击
                    }
                    ActionVo attackVo = GetSkillActionVo(skillVo, effectPos, dir, AppMap.Instance.me, index);
                    //怪物的伤害计算
                    GameFormula.CalcDamage(monsterVo, meVo, skillVo, out damageVal, out damageType, out stateType);
                    switch (damageType)
                    {
                    case GameConst.DAMAGE_TYPE_MISS:
                        isDodge = true;
                        break;

                    case GameConst.DAMAGE_TYPE_CRIT:
                        isCrit = true;
                        break;
                    }
                    if (!isDodge)//命中后,攻击者产生力反馈,受击者处理受击逻辑
                    {
                        atker.AttackController.ForceFeedBack(attackVo);
                        meControler.BeAttackedController.BeAttacked(attackVo);
                    }
                    int cutHp = damageVal; //伤害值
                    if (MeVo.instance.mapId == MapTypeConst.FirstFightMap &&
                        (meVo.CurHp < meVo.Hp * 0.3f || meVo.CurHp <= (uint)cutHp))
                    {
                        cutHp   = 0;
                        isDodge = true;
                    }
                    else
                    {
                        if (meVo.CurHp <= (uint)cutHp)
                        {
                            meVo.CurHp          = 0;
                            attackVo            = new ActionVo();
                            attackVo.ActionType = Actions.DEATH;
                            meControler.AttackController.AddAttackList(attackVo, true);
                        }
                        else
                        {
                            meVo.CurHp -= (uint)cutHp;
                        }
                    }
                    PlayerAiController.AddHudView(isDodge, isCrit, isParry, cutHp, (int)meVo.CurHp, Color.yellow);
                    //冒血直接冒
                    //攻击后重置受击抵抗属性
                    monsterVo.HurtResist = (uint)monsterVo.MonsterVO.hurt_resist;
                    return(true);
                }
            }
            monsterVo.HurtResist = (uint)monsterVo.MonsterVO.hurt_resist;
            return(false);
        }
Beispiel #17
0
        /**添加怪物到场景**/

        public void execute()
        {
            if (!_isRuning)
            {
                return;
            }
            float time = Time.time;

            if (time - _beginTime < delay)
            {
                return;
            }
            try
            {
                _beginTime = time;
                String mapId = AppMap.Instance.mapParser.MapId.ToString();

                IList <MonsterVo> list = _monsterVoList.ContainsKey(mapId) ? _monsterVoList[mapId] : null;
                //_monsterVoList里面存的怪是服务器返回的

                if (list == null || list.Count < 1)
                {
                    return;
                }
                MonsterVo item = list[0];
                if (AppMap.Instance.GetMonster(item.Id.ToString()) != null)
                {
                    return;
                }
                list.Remove(item);
                if (item.isDie)
                {
                    Log.info(this, "这个怪物已经死了,不用创建!");
                    return;
                }
                //创建怪物
                Log.info(this, "创建怪物 ,怪物类型ID:" + item.monsterId);
                item.ModelLoadCallBack = LoadMonsterCallBack;
                if (MeVo.instance.mapId == MapTypeConst.GoldHit_MAP)
                {
                    item.X = Random.Range(0.2f, 20f);
                    item.Y = Random.Range(AppMap.Instance.mapParser.CurrentMapRange.MinY + 0.5f,
                                          AppMap.Instance.mapParser.CurrentMapRange.MaxY);
                }
                else if (MeVo.instance.mapId == MapTypeConst.WORLD_BOSS)
                {
                    item.X = 16.8f;
                    item.Y = 1.8f;
                    BossMode.Instance.BossName = item.MonsterVO.name;  //缓存世界Boss名字
                    BossMode.Instance.BoosIcon = item.MonsterVO.icon;
                }
                else
                {
                    float minX = MapControl.Instance.MyCamera.LeftBoundX;
                    float maxX = MapControl.Instance.MyCamera.RightBoundX;
                    switch (item.bornType)
                    {
                    case 1:
                        maxX = minX - 1;
                        minX = minX - 3;
                        break;

                    case 3:
                        minX = maxX + 1;
                        maxX = maxX + 3;
                        break;

                    case 4:    //在镜头中随机点创建
                        minX = minX + 1;
                        maxX = maxX + 1;
                        break;
                    }
                    item.X = Random.Range(minX, maxX);
                    item.Y = Random.Range(AppMap.Instance.mapParser.CurrentMapRange.MinY,
                                          AppMap.Instance.mapParser.CurrentMapRange.MaxY);
                }
                AppMap.Instance.CreateMonster(item);
            }
            catch (Exception ex)
            {
                Log.error(this, "-execute() 添加怪物到场景出错,reason:" + ex.StackTrace);
            }
        }