/* * This file is part of aion-unique <aion-unique.org>. * * aion-unique is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * aion-unique is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with aion-unique. If not, see <http://www.gnu.org/licenses/>. */ package com.aionemu.gameserver.ai.desires.impl; import com.aionemu.commons.utils.Rnd; import com.aionemu.gameserver.ai.AI; import com.aionemu.gameserver.ai.desires.AbstractDesire; import com.aionemu.gameserver.ai.desires.MoveDesire; import com.aionemu.gameserver.dataholders.DataManager; import com.aionemu.gameserver.model.gameobjects.Npc; import com.aionemu.gameserver.model.templates.walker.RouteData; import com.aionemu.gameserver.model.templates.walker.WalkerTemplate; import com.aionemu.gameserver.network.aion.serverpackets.SM_EMOTION; import com.aionemu.gameserver.utils.MathUtil; import com.aionemu.gameserver.utils.PacketSendUtility; /** * @author KKnD * */ public class WalkDesire extends AbstractDesire implements MoveDesire { private Npc owner; private RouteData route; private boolean isWalkingToNextPoint = false; private int targetPosition; private long nextMoveTime; private boolean isRandomWalk = false; public WalkDesire(Npc npc, int power) { super(power); owner = npc; WalkerTemplate template = DataManager.WALKER_DATA.getWalkerTemplate(owner.getSpawn().getWalkerId()); if(template != null) { isRandomWalk = owner.getSpawn().hasRandomWalk(); route = template.getRouteData(); owner.getMoveController().setSpeed(owner.getObjectTemplate().getStatsTemplate().getWalkSpeed()); owner.getMoveController().setWalking(true); PacketSendUtility.broadcastPacket(owner, new SM_EMOTION(owner, 0x15)); } } @SuppressWarnings("unchecked") @Override public boolean handleDesire(AI ai) { if(owner == null) return false; if(route == null) return false; if(isWalkingToNextPoint()) checkArrivedToPoint(); walkToLocation(); return true; } /** * Check owner is in a route point */ private void checkArrivedToPoint() { float x = route.getRouteSteps().get(targetPosition).getX(); float y = route.getRouteSteps().get(targetPosition).getY(); float z = route.getRouteSteps().get(targetPosition).getZ(); double dist = MathUtil.getDistance(owner, x, y, z); if(dist <= 2) { setWalkingToNextPoint(false); getNextTime(); } } /** * set next route point if not set and time is ready */ private void walkToLocation() { if(!isWalkingToNextPoint() && nextMoveTime <= System.currentTimeMillis()) { setNextPosition(); setWalkingToNextPoint(true); float x = route.getRouteSteps().get(targetPosition).getX(); float y = route.getRouteSteps().get(targetPosition).getY(); float z = route.getRouteSteps().get(targetPosition).getZ(); owner.getMoveController().setNewDirection(x, y, z); if(!owner.getMoveController().isScheduled()) owner.getMoveController().schedule(); } } private boolean isWalkingToNextPoint() { return isWalkingToNextPoint; } private void setWalkingToNextPoint(boolean value) { isWalkingToNextPoint = value; } private void setNextPosition() { if(isRandomWalk) { targetPosition = Rnd.get(0, route.getRouteSteps().size() - 1); } else { if(targetPosition < (route.getRouteSteps().size() - 1)) targetPosition++; else targetPosition = 0; } } private void getNextTime() { int nextDelay = isRandomWalk ? Rnd.get(5, 60) : route.getRouteSteps().get(targetPosition).getRestTime(); nextMoveTime = System.currentTimeMillis() + nextDelay * 1000; } @Override public int getExecutionInterval() { return 1; } @Override public void onClear() { owner.getMoveController().stop(); } }