Package l2p.gameserver.model.entity.vehicle

Source Code of l2p.gameserver.model.entity.vehicle.L2VehicleTrajet

package l2p.gameserver.model.entity.vehicle;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.LineNumberReader;
import java.util.ArrayList;
import java.util.Map;
import java.util.StringTokenizer;

import javolution.util.FastMap;
import l2p.Config;
import l2p.common.ThreadPoolManager;
import l2p.gameserver.model.L2Character;
import l2p.gameserver.model.L2Player;
import l2p.gameserver.model.L2World;
import l2p.gameserver.model.L2WorldRegion;
import l2p.gameserver.serverpackets.ExShowTrace;
import l2p.util.GArray;
import l2p.util.Location;

public class L2VehicleTrajet
{
  private final L2Vehicle _boat;
  private Map<Integer, L2VehiclePoint> _path;
  public int _idWaypoint;
  public int _ticketId;
  public Location _return;
  public int _max;
  public String[] _msgs;

  public L2VehicleTrajet(L2Vehicle boat, int idWaypoint1, int idWTicket1, Location ret_loc, String[] msgs)
  {
    _boat = boat;
    _idWaypoint = idWaypoint1;
    _ticketId = idWTicket1;
    _return = ret_loc;
    _msgs = msgs;
    loadBoatPath();
  }

  private void parseLine(String line)
  {
    _path = new FastMap<Integer, L2VehiclePoint>().setShared(true);
    StringTokenizer st = new StringTokenizer(line, ";");
    st.nextToken(); // skip idWaypoint
    _max = Integer.parseInt(st.nextToken());
    for(int i = 0; i < _max; i++)
    {
      L2VehiclePoint bp = new L2VehiclePoint();
      bp.speed1 = Integer.parseInt(st.nextToken());
      bp.speed2 = Integer.parseInt(st.nextToken());
      bp.x = Integer.parseInt(st.nextToken());
      bp.y = Integer.parseInt(st.nextToken());
      bp.z = Integer.parseInt(st.nextToken());
      bp.teleport = Integer.parseInt(st.nextToken());
      if(i == 0 && _boat.isClanAirShip())
      {
        ((L2AirShip) _boat).setClanAirshipSpawnLoc(new Location(bp.x, bp.y, bp.z, bp.teleport));
      }
      _path.put(i, bp);
    }
  }

  public void addPathPoint(L2VehiclePoint bp)
  {
    _path.put(_max, bp);
    _max++;
  }

  public void loadBoatPath()
  {
    LineNumberReader lnr = null;
    try
    {
      File doorData = new File(Config.DATAPACK_ROOT, "data/vehiclepath.csv");
      lnr = new LineNumberReader(new BufferedReader(new FileReader(doorData)));
      String line = null;
      while((line = lnr.readLine()) != null)
      {
        if(line.trim().length() == 0 || !line.startsWith(_idWaypoint + ";"))
        {
          continue;
        }
        parseLine(line);
        return;
      }
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
    finally
    {
      try
      {
        if(lnr != null)
        {
          lnr.close();
        }
      }
      catch(Exception e1)
      { /* ignore problems */}
    }
  }

  public void moveNext()
  {
    _boat.setIsArrived(false);
    if(_boat._runstate >= _max) // Приехали
    {
      _boat.setIsDocked();
      _boat.setIsArrived(true);
      if(!_boat.isClanAirShip())
      {
        _boat._cycle = _boat._cycle == 1 ? 2 : 1;
      }
      _boat.say(5);
      _boat.broadcastVehicleStart(0);
      _boat.broadcastVehicleCheckLocation();
      _boat.broadcastVehicleInfo();
      _boat.broadcastStopMove();
      if(!_boat.isClanAirShip())
      {
        _boat.oustPlayers(); // Выгоняем пассажиров, если требуется
        _boat._vehicleCaptainTask = ThreadPoolManager.getInstance().scheduleGeneral(new L2VehicleCaptain(_boat, 1), 120000);
      }
      return;
    }
    // При свободном движении
    if(_boat._runstate < 0)
    {
      _boat.setIsArrived(true);
      return;
    }
    final L2VehiclePoint bp = _path.get(_boat._runstate);
    if(!_boat.isDocked())
    {
      L2WorldRegion region = L2World.getRegion(bp.x, bp.y, bp.z, false);
      if(region != null)
      {
        for(L2Character cha : region.getCharactersList(new GArray<L2Character>(), _boat.getObjectId(), _boat.getReflection().getId()))
        {
          if(cha instanceof L2Vehicle && cha != _boat)
          {
            L2Vehicle otherBoat = (L2Vehicle) cha;
            if(otherBoat.isDocked() && canConflict(_boat.getName(), otherBoat.getName()))
            {
              _boat.SayAndSound(_msgs[0], "The other ship is blocking the port, please wait...", null);
              _boat.broadcastVehicleStart(0);
              _boat.broadcastVehicleInfo();
              _boat.broadcastStopMove();
              ThreadPoolManager.getInstance().scheduleGeneral(new ContinueMoving(), 30000);
              return;
            }
          }
        }
      }
    }
    _boat._speed1 = bp.speed1;
    _boat._speed2 = bp.speed2;
    if(_boat.isDocked())
    {
      _boat.broadcastVehicleInfo();
    }
    if(bp.teleport > 0 && _boat.isAirShip())
    {
      _boat.teleportShip(bp.x, bp.y, bp.z, bp.teleport);
    }
    else
    {
      ThreadPoolManager.getInstance().executePathfind(new Runnable()
      {
        public void run()
        {
          _boat.moveToLocation(bp.x, bp.y, bp.z, 0, false);
          /* для дебага
          for(L2Player player : L2ObjectsStorage.getAllPlayersForIterate())
            if(player != null && player.isGM() && player.getVehicle() == _boat)
            {
              ArrayList<Location> points = new ArrayList<Location>();
              points.add(_boat.getLoc());
              points.add(_boat.getDestination());
              player.sendPacket(Points2Trace(player, points, 50, 60000));
            }
          */
        }
      });
    }
    _boat._runstate++;
  }

  private boolean canConflict(String name1, String name2)
  {
    if((name1.equalsIgnoreCase("Ship_Gludin_Rune_Gludin") || name2.equalsIgnoreCase("Ship_Gludin_Rune_Gludin")) && (name1.equalsIgnoreCase("Ship_Rune_Gludin_Rune") || name2.equalsIgnoreCase("Ship_Rune_Gludin_Rune")))
    {
      return true;
    }
    if((name1.equalsIgnoreCase("Ship_Gludin_Rune_Gludin") || name2.equalsIgnoreCase("Ship_Gludin_Rune_Gludin")) && (name1.equalsIgnoreCase("Ship_TI_Gludin_TI") || name2.equalsIgnoreCase("Ship_TI_Gludin_TI")))
    {
      return true;
    }
    if((name1.equalsIgnoreCase("Ship_Rune_Primeval_Rune") || name2.equalsIgnoreCase("Ship_Rune_Primeval_Rune")) && (name1.equalsIgnoreCase("Ship_Primeval_Rune_Primeval") || name2.equalsIgnoreCase("Ship_Primeval_Rune_Primeval")))
    {
      return true;
    }
    if((name1.equalsIgnoreCase("Ship_TI_Gludin_TI") || name2.equalsIgnoreCase("Ship_TI_Gludin_TI")) && (name1.equalsIgnoreCase("Ship_Gludin_TI_Gludin") || name2.equalsIgnoreCase("Ship_Gludin_TI_Gludin")))
    {
      return true;
    }
    if((name1.equalsIgnoreCase("Ship_TI_Giran_TI") || name2.equalsIgnoreCase("Ship_TI_Giran_TI")) && (name1.equalsIgnoreCase("Ship_TI_Gludin_TI") || name2.equalsIgnoreCase("Ship_TI_Gludin_TI")))
    {
      return true;
    }
    if((name1.equalsIgnoreCase("Ship_TI_Giran_TI") || name2.equalsIgnoreCase("Ship_TI_Giran_TI")) && (name1.equalsIgnoreCase("Ship_Gludin_TI_Gludin") || name2.equalsIgnoreCase("Ship_Gludin_TI_Gludin")))
    {
      return true;
    }
    if(name1.equalsIgnoreCase("Ship_Innadril_Tour") && name2.equalsIgnoreCase("Ship_Innadril_Tour"))
    {
      return true;
    }
    return false;
  }

  private class ContinueMoving implements Runnable
  {
    public void run()
    {
      moveNext();
    }
  }

  public static ExShowTrace Points2Trace(L2Player player, ArrayList<Location> points, int step, int time)
  {
    ExShowTrace result = new ExShowTrace();
    Location prev = null;
    int i = 0;
    for(Location p : points)
    {
      i++;
      if(player.isGM())
      {
        player.sendMessage(p.toString());
      }
      if(prev != null)
      {
        result.addLine(prev, p, step, time);
      }
      prev = p;
    }
    return result;
  }
}
TOP

Related Classes of l2p.gameserver.model.entity.vehicle.L2VehicleTrajet

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.