Package l2p.gameserver.model.entity

Source Code of l2p.gameserver.model.entity.Coliseum

package l2p.gameserver.model.entity;

import java.util.ArrayList;

import l2p.common.ThreadPoolManager;
import l2p.gameserver.instancemanager.UnderGroundColliseumManager;
import l2p.gameserver.instancemanager.ZoneManager;
import l2p.gameserver.model.L2Party;
import l2p.gameserver.model.L2Player;
import l2p.gameserver.model.L2Zone;
import l2p.gameserver.model.L2Zone.ZoneType;
import l2p.gameserver.serverpackets.SystemMessage;
import l2p.util.Location;
import l2p.util.Log;
import l2p.util.Rnd;

public class Coliseum
{
  private L2Party previusWinners = null;
  private boolean isWaitingRoom1Free = true;
  private boolean isWaitingRoom2Free = true;
  private boolean isInUse;
  private int winCount = 0;
  private L2Party partyInRoom1 = null;
  private L2Party partyInRoom2 = null;
  private int minlevel;
  private int maxlevel;

  public int getMinLevel()
  {
    return minlevel;
  }

  public int getMaxLevel()
  {
    return maxlevel;
  }

  public class TryStart implements Runnable
  {
    L2Party _party1;
    L2Party _party2;

    public TryStart(L2Party party, L2Party party2)
    {
      _party1 = party;
      _party2 = party2;
    }

    @Override
    public void run()
    {
      startBattle(_party1, _party2);
    }
  }

  public class StopBattle implements Runnable
  {
    L2Party _party1;
    L2Party _party2;
    int _winner = 0;

    public StopBattle(L2Party party, L2Party party2, int winner)
    {
      _party1 = party;
      _party2 = party2;
      _winner = winner;
    }

    @Override
    public void run()
    {
      party_inbattle_list.remove(_party1);
      party_inbattle_list.remove(_party2);
      if(_winner == 0) // Вылетели при тп
      {
        setPreviusWinner(null);
        setWinCount(0);
      }
      else
      {
        if(_party1.getPartyLeader().getTeam() == _winner)
        {
          if(!getPreviusWinners().equals(_party1))
          {
            setPreviusWinner(_party1);
            setWinCount(1);
            for(L2Player member : _party1.getPartyMembers())
            {
              member.setFame(member.getFame() + 80, "Coliseum");
            }
          }
          else
          {
            incWinCount();
            for(L2Player member : _party1.getPartyMembers())
            {
              member.setFame(member.getFame() + 80 + getWinCount() * 5, "Coliseum");
            }
          }
          int[] teleloc = getFreeWaitingRoom();
          if(teleloc[0] == 0)
          {
            teleloc = _zone.getSpawns().get(4);
          }
          else if(isWaitingRoom2Free() && isWaitingRoom1Free())
          {
            setPreviusWinner(null);
            for(L2Player member : _party1.getPartyMembers())
            {
              if(!member.isDead())
              {
                member.teleToClosestTown();
              }
            }
          }
          else if(!isWaitingRoom1Free())
          {
            teleloc = _zone.getSpawns().get(1);
            startBattle(getPartyInRoom1(), _party1);
          }
        }
        if(_party2.getPartyLeader().getTeam() == _winner)
        {
          if(!getPreviusWinners().equals(_party2))
          {
            setPreviusWinner(_party2);
            setWinCount(1);
            for(L2Player member : _party2.getPartyMembers())
            {
              member.setFame(member.getFame() + 80, "Coliseum");
            }
          }
          else
          {
            incWinCount();
            for(L2Player member : _party2.getPartyMembers())
            {
              member.setFame(member.getFame() + 80 + getWinCount() * 5, "Coliseum");
            }
          }
          int[] teleloc = getFreeWaitingRoom();
          if(teleloc[0] == 0)
          {
            teleloc = _zone.getSpawns().get(4);
          }
          else if(isWaitingRoom2Free() && isWaitingRoom1Free())
          {
            setPreviusWinner(null);
            for(L2Player member : _party2.getPartyMembers())
            {
              if(!member.isDead())
              {
                member.teleToClosestTown();
              }
            }
          }
          else if(!isWaitingRoom1Free())
          {
            teleloc = _zone.getSpawns().get(1);
            startBattle(getPartyInRoom1(), _party2);
          }
        }
        setIsInUse(false);
      }
    }
  }

  public class StartBattle implements Runnable
  {
    int _number;
    L2Party _party1;
    L2Party _party2;

    public StartBattle(L2Party party, L2Party party2)
    {
      _number = getColiseumMatchNumber();
      _party1 = party;
      _party2 = party2;
    }

    public void run()
    {
      party_waiting_list.remove(_party1);
      party_waiting_list.remove(_party2);
      if(getPartyInRoom1().equals(_party1) || getPartyInRoom1().equals(_party2))
      {
        setPartyInRoom1(null);
      }
      if(getPartyInRoom2().equals(_party1) || getPartyInRoom2().equals(_party2))
      {
        setPartyInRoom2(null);
      }
      boolean isParty1Ready = checkOffline(_party1);
      boolean isParty2Ready = checkOffline(_party2);
      if(!isParty1Ready)
      {
        //SM ? //CM ? //Not brodcast?
        party_waiting_list.remove(_party1);
        setIsWaitingRoom1Free(true);
        _party2.broadcastMessageToPartyMembers("opponents party is offline, wait for next opponent");
        return;
      }
      else if(!isParty2Ready)
      {
        party_waiting_list.remove(_party2);
        setIsWaitingRoom2Free(true);
        _party1.broadcastMessageToPartyMembers("opponents party is offline, wait for next opponent");
        return;
      }
      else
      {
        party_inbattle_list.addAll(party_waiting_list);
        party_waiting_list.remove(_party2);
        party_waiting_list.remove(_party1);
        setIsWaitingRoom1Free(true);
        setIsWaitingRoom2Free(true);
        teleportPlayers(_party1, _party2);
        setIsInUse(true);
        if(party_waiting_list.size() > 0)
        {
          ArrayList<L2Party> toDel = new ArrayList<L2Party>();
          for(L2Party party : party_waiting_list)
          {
            if(party.getPartyMembers().size() > 6)
            {
              party.broadcastMessageToPartyMembers("Free room at coliseum append");//FIXME: SM? CM? not broadcast?
            }
            else
            {
              toDel.add(party);
            }
          }
          for(L2Party party : toDel)
          {
            party.broadcastMessageToPartyMembers("conditions are nor right for Undergorund battle try register later");//FIXME: SM? CM? not broadcast?
            party_waiting_list.remove(party);
          }
          if(party_waiting_list.size() == 0)
          {
            return;
          }
          L2Party next = party_waiting_list.get(Rnd.get(party_waiting_list.size() - 1));
          for(L2Player member : next.getPartyMembers())
          {
            if(member.getLevel() > getMaxLevel() || member.getLevel() < getMinLevel())
            {
              next.broadcastToPartyMembers(new SystemMessage(SystemMessage.C1S_LEVEL_REQUIREMENT_IS_NOT_SUFFICIENT_AND_CANNOT_BE_ENTERED).addName(member));
              return;
            }
            if(member.isCursedWeaponEquipped())
            {
              next.broadcastToPartyMembers(new SystemMessage(SystemMessage.C1S_QUEST_REQUIREMENT_IS_NOT_SUFFICIENT_AND_CANNOT_BE_ENTERED).addName(member));
              return;
            }
            int[] teleloc = getFreeWaitingRoom();
            if(teleloc[0] == 0)
            {
              Log.add("bug cannot find teleloc for coliseum id: " + getId(), "UC");
              return;
            }
            teleportToWaitingRoom(next, teleloc);
          }
          if(party_waiting_list.size() < 2)
          {
            return;
          }
          L2Party next2 = party_waiting_list.get(Rnd.get(party_waiting_list.size() - 1));
          while(next2 == next)
          {
            next2 = party_waiting_list.get(Rnd.get(party_waiting_list.size() - 1));
          }
          next = next2;
          for(L2Player member : next.getPartyMembers())
          {
            if(member.getLevel() > getMaxLevel() || member.getLevel() < getMinLevel())
            {
              next.broadcastToPartyMembers(new SystemMessage(SystemMessage.C1S_LEVEL_REQUIREMENT_IS_NOT_SUFFICIENT_AND_CANNOT_BE_ENTERED).addName(member));
              return;
            }
            int[] teleloc = getFreeWaitingRoom();
            if(teleloc[0] == 0)
            {
              Log.add("bug cannot find teleloc for coliseum id: " + getId(), "UC");
              return;
            }
            teleportToWaitingRoom(next, teleloc);
          }
        }
      }
    }
    //startTimer()
    //SpawnLifeTowers()
    //startCompWinners()
  }

  private boolean checkOffline(L2Party party)
  {
    party_waiting_list.add(party);
    return party.getMemberCount() == 0;
  }

  private ArrayList<L2Party> party_waiting_list = new ArrayList<L2Party>();
  private ArrayList<L2Party> party_inbattle_list = new ArrayList<L2Party>();
  private L2Zone _zone;
  private int _id = 0;
  private static Integer _event_cycle = 0;

  public Coliseum(int id)
  {
    _id = id;
    minlevel = id;
    maxlevel = id == 1 ? 85 : id + 9;
    try
    {
      load(id);
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
    if(_event_cycle == 0)
    {
      init();
    }
  }

  private void load(int id)
  {
    _event_cycle = getColiseumMatchNumber();//tempory need db table and save system
    if(_event_cycle == Integer.MAX_VALUE)
    {
      _event_cycle = 1;
    }
    else
    {
      _event_cycle++;
    }
  }

  private void init()
  {
    setcoliseummatchnumber(1);
  }

  private void startBattle(L2Party party, L2Party party2)
  {
    if(!isInUse())
    {
      if(getPreviusWinners() == null)
      {
        ThreadPoolManager.getInstance().scheduleGeneral(new StartBattle(party, party2), 10000);
      }
      else
      {
        ThreadPoolManager.getInstance().scheduleGeneral(new StartBattle(party, getPreviusWinners()), 10000);
        setIsWaitingRoom1Free(true);
        int[] teleloc = getFreeWaitingRoom();
        setIsWaitingRoom2Free(true);
        teleportToWaitingRoom(party2, teleloc);
      }
    }
    else
    {
      ThreadPoolManager.getInstance().scheduleGeneral(new TryStart(party, party2), 300000);
    }
  }

  public static void register(L2Player player, int minLevel, int maxLevel)
  {
    Coliseum coli = UnderGroundColliseumManager.getInstance().getColiseumByLevelLimit(maxLevel);
    if(coli == null)
    {
      player.sendMessage("this is not work now, if you have any information about it, contact as");
      return;
    }
    int[] teleloc = coli.getFreeWaitingRoom();
    if(teleloc[0] == 0)
    {
      player.sendMessage("this is not work now, if you have any information about it, contact as");
    }
    coli.party_waiting_list.add(player.getParty());
    coli.teleportToWaitingRoom(player.getParty(), teleloc);
  }

  public void teleportToWaitingRoom(L2Party party, int[] teleloc)
  {
    if(isWaitingRoom1Free())
    {
      setIsWaitingRoom1Free(false);
      setPartyInRoom1(party);
    }
    else if(isWaitingRoom2Free())
    {
      setIsWaitingRoom2Free(false);
      setPartyInRoom2(party);
    }
    else
    {
      //TODO: CM? SM?
      party.getPartyLeader().sendMessage("rooms are not free you has been registred try to use teleport function later");
      return;
    }
    for(L2Player member : party.getPartyMembers())
    {
      member.teleToLocation(new Location(teleloc[0], teleloc[1], teleloc[2]));
    }
    if(!isWaitingRoom2Free)
    {
      startBattle(getPartyInRoom1(), getPartyInRoom2());
    }
  }
  //FIXME: если комнат ожидания больше чем две, переписать данный метод на более оптимальный

  public int[] getFreeWaitingRoom()
  {
    if(isWaitingRoom1Free())
    {
      return _zone.getSpawns().get(0);
    }
    else if(isWaitingRoom2Free())
    {
      return _zone.getSpawns().get(1);
    }
    else
    {
      return new int[0];
    }
  }

  public int getColiseumMatchNumber()
  {
    return _event_cycle;
  }

  public void setcoliseummatchnumber(int number)
  {
    _event_cycle = number;
  }

  /**
   * Return true if object is inside the zone
   */
  public boolean checkIfInZone(int x, int y)
  {
    return getZone().checkIfInZone(x, y);
  }

  public int getId()
  {
    return _id;
  }

  public final L2Zone getZone()
  {
    if(_zone == null)
    {
      _zone = ZoneManager.getInstance().getZoneByIndex(ZoneType.UnderGroundColiseum, getId(), true);
    }
    return _zone;
  }

  public void StopBattle(L2Party party, L2Party party2, int winner, long period)
  {
    ThreadPoolManager.getInstance().scheduleGeneral(new StopBattle(party, party2, winner), period);
  }

  public void teleportPlayers(L2Party party, L2Party party2)
  {
    if(party == null && party2 == null || party2 == null && party != null && party.getPartyMembers().isEmpty() || party == null && party2 != null && party2.getPartyMembers().isEmpty() || party2 != null && party != null && party.getPartyMembers().isEmpty() && party2.getPartyMembers().isEmpty())
    {
      StopBattle(party, party2, 0, 20000);//все вылетели обнулим битву
      party_inbattle_list.remove(party);
      party_inbattle_list.remove(party2);
    }
    if(party2 != null && (party == null || party.getPartyMembers().isEmpty()))
    {
      StopBattle(party, party2, party2.getPartyLeader().getTeam(), 20000);//20 сек перед тп обратно второй пати
      party_inbattle_list.remove(party);
    }
    else if(party != null && (party2 == null || party2.getPartyMembers().isEmpty()))
    {
      StopBattle(party, party2, party.getPartyLeader().getTeam(), 20000);//20 сек перед тп обратно первой пати
      party_inbattle_list.remove(party2);
    }
    else
    {
      int[] locOnBGToTP;
      if(party != null)
      {
        for(L2Player member : party.getPartyMembers())
        {
          member.setTeam(1, true);
          //locOnBattleGroundToTelePlayers
          locOnBGToTP = _zone.getSpawns().get(3);
          member.teleToLocation(new Location(locOnBGToTP[0], locOnBGToTP[1], locOnBGToTP[2]));
        }
      }
      if(party2 != null)
      {
        for(L2Player member : party2.getPartyMembers())
        {
          member.setTeam(2, true);
          locOnBGToTP = _zone.getSpawns().get(4);
          member.teleToLocation(new Location(locOnBGToTP[0], locOnBGToTP[1], locOnBGToTP[2]));
        }
      }
    }
  }

  public void setPreviusWinner(L2Party previusWinners)
  {
    this.previusWinners = previusWinners;
  }

  public L2Party getPreviusWinners()
  {
    return previusWinners;
  }

  public void setIsWaitingRoom1Free(boolean isWaitingRoom1Free)
  {
    this.isWaitingRoom1Free = isWaitingRoom1Free;
  }

  public boolean isWaitingRoom1Free()
  {
    return isWaitingRoom1Free;
  }

  public void setIsWaitingRoom2Free(boolean isWaitingRoom2Free)
  {
    this.isWaitingRoom2Free = isWaitingRoom2Free;
  }

  public boolean isWaitingRoom2Free()
  {
    return isWaitingRoom2Free;
  }

  public void setIsInUse(boolean isInUse)
  {
    this.isInUse = isInUse;
  }

  public boolean isInUse()
  {
    return isInUse;
  }

  public ArrayList<L2Party> getPartysInBattleGround()
  {
    return party_inbattle_list;
  }

  public ArrayList<L2Party> getWaitingPartys()
  {
    return party_waiting_list;
  }

  public void setWinCount(int winCount)
  {
    this.winCount = winCount;
  }

  public void incWinCount()
  {
    winCount++;
  }

  public int getWinCount()
  {
    return winCount;
  }

  public L2Party getPartyInRoom1()
  {
    return partyInRoom1;
  }

  public L2Party getPartyInRoom2()
  {
    return partyInRoom2;
  }

  public void setPartyInRoom1(L2Party p1)
  {
    partyInRoom1 = p1;
  }

  public void setPartyInRoom2(L2Party p2)
  {
    partyInRoom2 = p2;
  }
}
TOP

Related Classes of l2p.gameserver.model.entity.Coliseum

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.