Beispiel #1
0
 public MonsterTask(NecServer server, MonsterSpawn monster)
 {
     _monster      = monster;
     _server       = server;
     monsterFreeze = false;
     monsterActive = true;
     monsterMoving = false;
     casting       = false;
     spawnMonster  = true;
     monsterHome   = null;
     _monster.CurrentCoordIndex = 1;
     pathingTick     = 100;
     agroTick        = 200;
     updateTime      = pathingTick;
     agroMoveTime    = 0;
     agroTickMove    = new MonsterTick();
     waitTime        = 2000;
     currentWait     = 0;
     moveTime        = updateTime;
     monsterWaiting  = true;
     agroRange       = 1000;
     agroCheckTime   = -1;
     agroDetectAngle = (float)Math.Cos(Math.PI / 1.9);
     agroMoveAngle   = (float)Math.Cos(Math.PI / 4);
     CastState       = 0;
     respawnTime     = 10000;
     currentSkill    = 0;
     skillInstanceId = 0;
     Map             = _server.Maps.Get(_monster.MapId);
     currentDest     = new Vector3();
 }
 public MonsterTask(NecServer server, MonsterSpawn monster)
 {
     this.monster  = monster;
     this.server   = server;
     monsterFreeze = false;
     monsterActive = true;
     monsterMoving = false;
     _casting      = false;
     _spawnMonster = true;
     monsterHome   = null;
     this.monster.currentCoordIndex = 1;
     _pathingTick     = 100;
     _agroTick        = 200;
     _updateTime      = _pathingTick;
     _agroMoveTime    = 0;
     _agroTickMove    = new MonsterTick();
     _waitTime        = 2000;
     _currentWait     = 0;
     _moveTime        = _updateTime;
     _monsterWaiting  = true;
     agroRange        = 1000;
     _agroCheckTime   = -1;
     _agroDetectAngle = (float)Math.Cos(Math.PI / 1.9);
     _agroMoveAngle   = (float)Math.Cos(Math.PI / 4);
     _castState       = 0;
     _respawnTime     = 10000;
     _currentSkill    = 0;
     _skillInstanceId = 0;
     _map             = this.server.maps.Get(this.monster.mapId);
     _currentDest     = new Vector3();
 }
        private void MonsterAgroMove()
        {
            float   distance    = 0;
            int     tickDivisor = 1000 / _moveTime;
            Vector3 monsterPos  = new Vector3(monster.x, monster.y, monster.z);

            //ShowVectorInfo(_monster.X, _monster.Y, _monster.Z, currentDest.X, currentDest.Y, currentDest.Z);
            distance = GetDistance(monsterPos, _currentDest);
            Character currentTarget = monster.GetCurrentTarget();
            Vector3   targetPos     = new Vector3(currentTarget.x, currentTarget.y, currentTarget.z);

            if (distance < monster.monsterRunVelocity / tickDivisor || _agroMoveTime >= 1000 || !monsterMoving)
            {
                _agroMoveTime = _agroTick;
                monsterMoving = true;
                if (!_casting && CheckHeading() == false)
                {
                    OrientMonster();
                }

                // Set destination to a position monsterGoto away from target
                float   monsterGoto = monster.GetGotoDistance();
                Vector3 moveTo      = Vector3.Subtract(targetPos, monsterPos);
                distance = GetDistance(monsterPos, targetPos);
                //Logger.Debug($"Target distance [{distance}] targetPos.X [{targetPos.X}] targetPos.Y [{targetPos.Y}] targetPos.Z [{targetPos.Z}]");
                float factor = (float)Math.Sqrt((monsterPos.X - targetPos.X) * (monsterPos.X - targetPos.X) +
                                                (monsterPos.Y - targetPos.Y) * (monsterPos.Y - targetPos.Y)) /
                               monsterGoto;
                _currentDest.Z = targetPos.Z;
                _currentDest.X = targetPos.X - moveTo.X / factor;
                _currentDest.Y = targetPos.Y - moveTo.Y / factor;
                moveTo         = Vector3.Subtract(_currentDest, monsterPos);

                // Now do the move
                distance = GetDistance(monsterPos, _currentDest);
                //Logger.Debug($"Moving distance [{distance}] currentDest.X [{currentDest.X}] currentDest.Y [{currentDest.Y}] currentDest.Z [{currentDest.Z}]");
                if (distance <= monster.GetGotoDistance())
                {
                    return;
                }
                float       travelTime = distance / monster.monsterRunVelocity;
                MonsterTick tick       = new MonsterTick();
                tick.xTick          = moveTo.X;
                tick.yTick          = moveTo.Y;
                tick.zTick          = moveTo.Z;
                _agroTickMove.xTick = moveTo.X / travelTime / tickDivisor;
                _agroTickMove.yTick = moveTo.Y / travelTime / tickDivisor;
                _agroTickMove.zTick = 0;
                //Logger.Debug($"Moving distance [{distance}] monsterVelocity [{_monster.MonsterRunVelocity}]  travelTime[{travelTime}] xTick [{tick.xTick}] yTick [{tick.yTick}] moveTo.X [{moveTo.X}] moveTo.Y [{moveTo.Y}] moveTo.Z [{moveTo.Z}]");
                monster.MonsterMove(server, 3, 0, tick, travelTime);
            }
            else
            {
                //float travelTime = (float)distance / _monster.MonsterRunVelocity;
                //Vector3 moveTo = Vector3.Subtract(currentDest, monsterPos);
                distance = GetDistance(monsterPos, _currentDest);
                if (distance >= monster.monsterRunVelocity / tickDivisor)
                {
                    monster.x = monster.x + _agroTickMove.xTick;
                    monster.y = monster.y + _agroTickMove.yTick;
                    //_monster.Z = _monster.Z + (moveTo.Z / travelTime) / tickDivisor;
                }
                else
                {
                    monster.x = _currentDest.X;
                    monster.y = _currentDest.Y;
                    monster.z = _currentDest.Z;
                }

                bool inMovePov = CheckFov(targetPos, _agroMoveAngle);
                if (!inMovePov && monsterMoving)
                {
                    Thread.Sleep(_updateTime);
                    monsterMoving = false;
                    monster.MonsterStop(server, 1, 0, 0.1F);
                    Thread.Sleep(100);
                    return;
                }

                _agroMoveTime += _agroTick;
            }
        }
Beispiel #4
0
        private void MonsterAgroMove()
        {
            float   distance    = 0;
            int     tickDivisor = 1000 / moveTime;
            Vector3 monsterPos  = new Vector3(_monster.X, _monster.Y, _monster.Z);

            //ShowVectorInfo(_monster.X, _monster.Y, _monster.Z, currentDest.X, currentDest.Y, currentDest.Z);
            distance = GetDistance(monsterPos, currentDest);
            Character currentTarget = _monster.GetCurrentTarget();
            Vector3   targetPos     = new Vector3(currentTarget.X, currentTarget.Y, currentTarget.Z);

            if (distance < (_monster.MonsterRunVelocity / tickDivisor) || agroMoveTime >= 1000 || !monsterMoving)
            {
                agroMoveTime  = agroTick;
                monsterMoving = true;
                if (!casting && CheckHeading() == false)
                {
                    orientMonster();
                }

                // Set destination to a position monsterGoto away from target
                float   monsterGoto = _monster.GetGotoDistance();
                Vector3 moveTo      = Vector3.Subtract(targetPos, monsterPos);
                distance = GetDistance(monsterPos, targetPos);
                //Logger.Debug($"Target distance [{distance}] targetPos.X [{targetPos.X}] targetPos.Y [{targetPos.Y}] targetPos.Z [{targetPos.Z}]");
                float factor = (float)Math.Sqrt(((monsterPos.X - targetPos.X) * (monsterPos.X - targetPos.X)) +
                                                ((monsterPos.Y - targetPos.Y) * (monsterPos.Y - targetPos.Y))) /
                               monsterGoto;
                currentDest.Z = targetPos.Z;
                currentDest.X = targetPos.X - (moveTo.X / factor);
                currentDest.Y = targetPos.Y - (moveTo.Y / factor);
                moveTo        = Vector3.Subtract(currentDest, monsterPos);

                // Now do the move
                distance = GetDistance(monsterPos, currentDest);
                //Logger.Debug($"Moving distance [{distance}] currentDest.X [{currentDest.X}] currentDest.Y [{currentDest.Y}] currentDest.Z [{currentDest.Z}]");
                if (distance <= _monster.GetGotoDistance())
                {
                    return;
                }
                float       travelTime = distance / _monster.MonsterRunVelocity;
                MonsterTick tick       = new MonsterTick();
                tick.xTick         = moveTo.X;
                tick.yTick         = moveTo.Y;
                tick.zTick         = moveTo.Z;
                agroTickMove.xTick = (moveTo.X / travelTime) / tickDivisor;
                agroTickMove.yTick = (moveTo.Y / travelTime) / tickDivisor;
                agroTickMove.zTick = 0;
                //Logger.Debug($"Moving distance [{distance}] monsterVelocity [{_monster.MonsterRunVelocity}]  travelTime[{travelTime}] xTick [{tick.xTick}] yTick [{tick.yTick}] moveTo.X [{moveTo.X}] moveTo.Y [{moveTo.Y}] moveTo.Z [{moveTo.Z}]");
                _monster.MonsterMove(_server, (byte)3, (byte)0, tick, travelTime);
            }
            else
            {
                //float travelTime = (float)distance / _monster.MonsterRunVelocity;
                //Vector3 moveTo = Vector3.Subtract(currentDest, monsterPos);
                distance = GetDistance(monsterPos, currentDest);
                if (distance >= _monster.MonsterRunVelocity / tickDivisor)
                {
                    _monster.X = _monster.X + agroTickMove.xTick;
                    _monster.Y = _monster.Y + agroTickMove.yTick;
                    //_monster.Z = _monster.Z + (moveTo.Z / travelTime) / tickDivisor;
                }
                else
                {
                    _monster.X = currentDest.X;
                    _monster.Y = currentDest.Y;
                    _monster.Z = currentDest.Z;
                }

                bool inMovePOV = checkFOV(targetPos, agroMoveAngle);
                if (!inMovePOV && monsterMoving)
                {
                    Thread.Sleep(updateTime);
                    monsterMoving = false;
                    _monster.MonsterStop(_server, 1, 0, 0.1F);
                    Thread.Sleep(100);
                    return;
                }

                agroMoveTime += agroTick;
            }
        }