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; } }
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; } }