예제 #1
0
    bool GetPositionAndRotation(out Vector3 pos, out Quaternion rot, float minAngle, float maxAngle)
    {
        pos = Vector3.zero;
        rot = Quaternion.identity;

        pos = AiUtil.GetRandomPosition(transform.position, mMinRadius, mMaxRadius,
                                       Vector3.forward, minAngle, maxAngle, 10.0f,
                                       AiUtil.groundedLayer, 5);

        if (pos != Vector3.zero)
        {
            return(true);
        }

        if (!GameConfig.IsMultiMode)
        {
            pos = AiUtil.GetRandomPosition(transform.position, mMinRadius, mMaxRadius,
                                           Vector3.forward, minAngle, maxAngle);

            if (pos != Vector3.zero)
            {
                return(true);
            }
        }

        return(false);
    }
예제 #2
0
    Vector3 GetCorrectPosition()
    {
        if (!ignoreTerrain)
        {
            for (int i = 0; i < 5; i++)
            {
                Vector3 position = AiUtil.GetRandomPosition(
                    transform.position, 0.0f, radius, 200.0f, AiUtil.groundedLayer, 5);

                if (IsValid(position))
                {
                    return(position);
                }
            }
        }
        else
        {
            for (int i = 0; i < 5; i++)
            {
                Vector3 position = transform.position + Random.insideUnitSphere * radius;

                if (IsValid(position))
                {
                    return(position);
                }
            }
        }

        return(Vector3.zero);
    }
예제 #3
0
    Vector3 GetRandomPosition(AISpawnData data, Vector3 center)
    {
        for (int i = 0; i < 10; i++)
        {
            Vector3 pos = AiUtil.GetRandomPosition(center, minRadius, maxRadius, Vector3.forward, data.minAngle, data.maxAngle);
            if (!IsInCSCommon(pos))
            {
                return(pos);
            }
        }

        return(Vector3.zero);
    }
예제 #4
0
    Vector3 GetPosition(IntVector4 node)
    {
        for (int i = 0; i < 10; i++)
        {
            Vector3 pos = AiUtil.GetRandomPosition(node);
            if (!IsInCSCommon(pos))
            {
                return(pos);
            }
        }

        return(Vector3.zero);
    }
예제 #5
0
    void OnTerrainColliderCreated(IntVector4 node)
    {
        if (node.w == 0)
        {
            IntVector2 mark = new IntVector2(node.x, node.z);
            if (!mExists.Contains(mark))
            {
                if (Random.value < probability)
                {
                    Vector3 pos = AiUtil.GetRandomPosition(node);

                    if (AiUtil.CheckPositionOnGround(ref pos,
                                                     0.0f,
                                                     VoxelTerrainConstants._numVoxelsPerAxis << node.w,
                                                     AiUtil.groundedLayer))
                    {
                        if (!AiUtil.CheckPositionUnderWater(pos))
                        {
                            GameObject faece = Instantiate(GetRandomFaeces(), pos, Quaternion.identity) as GameObject;
                            faece.transform.parent = transform;

                            mFaeces.Add(faece);

                            StartCoroutine(DestroyFaece(faece, 400.0f));
                        }
                    }
                }

                mExists.Add(mark);
            }

            List <GameObject> faeces = mFaeces.FindAll(ret => MatchFaece(node, ret));
            foreach (GameObject ite in faeces)
            {
                Vector3 pos      = ite.transform.position;
                float   distance = pos.y - node.y;
                if (distance > PETools.PEMath.Epsilon)
                {
                    RaycastHit hitInfo;
                    if (Physics.Raycast(pos + Vector3.up * 0.1f, Vector3.down, out hitInfo, distance, AiUtil.groundedLayer))
                    {
                        if (ite.GetComponent <Rigidbody>() != null)
                        {
                            ite.GetComponent <Rigidbody>().useGravity = true;
                        }
                    }
                }
            }
        }
    }
예제 #6
0
    bool GetPositionAndRotation(out Vector3 pos, out Quaternion rot)
    {
        pos = Vector3.zero;
        rot = Quaternion.identity;

        pos = AiUtil.GetRandomPosition(transform.position, 0.0f, mRadius, 10.0f, AiUtil.groundedLayer, 5);

        if (pos != Vector3.zero)
        {
            return(true);
        }

        pos = AiUtil.GetRandomPosition(transform.position, 0.0f, mRadius);

        if (pos != Vector3.zero)
        {
            return(true);
        }

        return(false);
    }
    IEnumerator RefreshTowerMission()
    {
        _idxWave = 0;
        _uiData.CurWavesRemaining = _spData._waveDatas.Count;
        _uiData.TotalWaves        = _spData._waveDatas.Count;
        while (_idxWave < _spData._waveDatas.Count)
        {
            while (PreTime > 0)
            {
                yield return(new WaitForSeconds(TimeStep));

                PreTime -= TimeStep;
            }
            PreTime = 0;
            Vector3 dir    = _forward;
            Vector3 center = _position;
            int     m      = _idxWave;
            AISpawnTDWavesData.TDWaveData wd = _spData._waveDatas[m];
            if (Pathea.PeGameMgr.IsStory)
            {
                StroyManager.Instance.PushStoryList(wd._plotID);
            }
            int nMonsterTypes = wd._monsterTypes.Count;
            for (int n = 0; n < nMonsterTypes; n++)
            {
                int spType   = wd._monsterTypes[n];
                int minAngle = wd._minDegs[n];
                int maxAngle = wd._maxDegs[n];
                int spCount  = UnityEngine.Random.Range(wd._minNums[n], wd._maxNums[n]);

                for (int i = 0; i < spCount; i++)
                {
                    Vector3 pos;
                    if (spType == 520 || spType == 521)                         //Special code for airborne monsters
                    {
                        pos = center;
                    }
                    else
                    {
                        if (isSweep)
                        {
                            pos = AiUtil.GetRandomPosition(center, 80, 100, dir, minAngle, maxAngle);
                            transform.position = center + ((center - pos) * 1000);
                        }
                        else
                        {
                            pos = AiUtil.GetRandomPosition(center, 20, 80, dir, minAngle, maxAngle);
                        }
                        pos.y = SceneEntityPosAgent.PosYTBD;                            // let posagent to set y
                    }
                    SceneEntityPosAgent agent = MonsterEntityCreator.CreateAgent(pos, EncodeBcnMonsterProtoId(spType, _spData._dif, _spData._spawnType));
                    agent.spInfo  = new MonsterEntityCreator.AgentInfo(this);
                    agent.canRide = false;

                    if (handerNewEntity != null)
                    {
                        handerNewEntity(agent);
                    }

                    _agents.Add(agent);
                    SceneMan.AddSceneObj(agent);
                }
            }
            if (handlerNewWave != null)
            {
                handlerNewWave(_spData, _idxWave);
            }

            _uiData.CurWavesRemaining--;

            _idxWave++;
            if (_idxWave < _spData._waveDatas.Count)
            {
                int cdTime = _spData._timeToCool;
                while (cdTime > 0)
                {
                    yield return(new WaitForSeconds(1));

                    cdTime--;
                }
                PreTime = (float)_spData._waveDatas[_idxWave]._delayTime;
            }
        }
        ;
    }
    public bool Start()
    {
        MissionCommonData data = MissionManager.GetMissionCommonData(MissionId);

        for (int i = 0; i < data.m_TargetIDList.Count; i++)
        {
            if (data.m_TargetIDList[i] == TargetId)
            {
                _idxTarId = i;
                break;
            }
        }
        if (_idxTarId == -1)
        {
            return(false);
        }
        _data = MissionManager.GetTypeMonsterData(TargetId);
        if (_data == null)
        {
            return(false);
        }
        Vector3 referToPos;

        switch (_data.m_mr.refertoType)
        {
        case ReferToType.None:
            referToPos = PeCreature.Instance.mainPlayer.position;
            break;

        case ReferToType.Player:
            referToPos = PeCreature.Instance.mainPlayer.position;
            break;

        case ReferToType.Town:
            VArtifactUtil.GetTownPos(_data.m_mr.referToID, out referToPos);
            break;

        case ReferToType.Npc:
            referToPos = EntityMgr.Instance.Get(MissionManager.Instance.m_PlayerMission.adId_entityId[_data.m_mr.referToID]).position;
            break;

        default:
            referToPos = PeCreature.Instance.mainPlayer.position;
            break;
        }
        if (referToPos == Vector3.zero)
        {
            return(false);
        }
        if (PeGameMgr.IsSingle || PeGameMgr.IsTutorial)
        {
            if (_data.type == 2)
            {
                DoodadEntityCreator.commonDeathEvent += OnMonsterDeath;
            }
            else
            {
                MonsterEntityCreator.commonDeathEvent += OnMonsterDeath;
            }
        }

        GenMonsterInMission = !PeGameMgr.IsStory;
        if (GenMonsterInMission)
        {
#if  DbgNearGen
            Vector2 v2 = Vector2.zero;
#else
            Vector2 v2 = UnityEngine.Random.insideUnitCircle.normalized * _data.m_mr.radius1;
#endif
            Vector3 center = referToPos + new Vector3(v2.x, 0.0f, v2.y);
            //for (int i = 0; i < _data.m_MonsterList.Count; i++) {
            //	int num = _data.m_MonsterList[i].type;
            //             int protoId = _data.m_MonsterList[i].npcs[UnityEngine.Random.Range(0, _data.m_MonsterList[i].npcs.Count)];
            //	for (int j = 0; j < num; j++) {
            //		Vector3 pos = AiUtil.GetRandomPosition (center, 0, _data.m_mr.radius2);
            //		pos.y = SceneEntityPosAgent.PosYTBD;	// let posagent to set y
            //		SceneEntityPosAgent agent = MonsterEntityCreator.CreateAgent(pos, protoId);
            //		agent.spInfo = new MonsterEntityCreator.AgentInfo(EntityMonsterBeacon.GetSpBeacon4MonsterKillTask());
            //		_agents.Add (agent);
            //		SceneMan.AddSceneObj (agent);
            //	}
            //}

            for (int i = 0; i < _data.m_CreMonList.Count; i++)
            {
                for (int j = 0; j < _data.m_CreMonList[i].monNum; j++)
                {
                    Vector3 pos = AiUtil.GetRandomPosition(center, 0, _data.m_mr.radius2);
                    pos.y = SceneEntityPosAgent.PosYTBD;    // let posagent to set y
                    int protoId = _data.m_CreMonList[i].monID;
                    if (_data.m_CreMonList[i].type == 1)
                    {
                        protoId |= EntityProto.IdGrpMask;
                    }
                    SceneEntityPosAgent agent = MonsterEntityCreator.CreateAgent(pos, protoId);
                    agent.spInfo  = new MonsterEntityCreator.AgentInfo(EntityMonsterBeacon.GetSpBeacon4MonsterKillTask());
                    agent.canRide = false;
                    _agents.Add(agent);
                    SceneMan.AddSceneObj(agent);
                }
            }
        }
        return(true);
    }
예제 #9
0
 Vector3 GetSpawnPosition(Vector3 center, float minRange, float maxRange)
 {
     return(AiUtil.GetRandomPosition(center, minRange, maxRange, 15.0f, AiUtil.groundedLayer, 10));
 }