//在地图中增加怪物并初始化怪物的基础数据 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); } } }
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); } }
// 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(); }
/**放入队列**/ 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++; }
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); }
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行为 }
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); } }
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); } }
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++; }
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(); } } }
/**根据怪物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); }
/**移除怪物**/ 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(); // 给服务器发送通知 }
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; }
/// <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); }
/**添加怪物到场景**/ 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); } }