L2Territory.java 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /*
  2. * This program is free software: you can redistribute it and/or modify it under
  3. * the terms of the GNU General Public License as published by the Free Software
  4. * Foundation, either version 3 of the License, or (at your option) any later
  5. * version.
  6. *
  7. * This program is distributed in the hope that it will be useful, but WITHOUT
  8. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  9. * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  10. * details.
  11. *
  12. * You should have received a copy of the GNU General Public License along with
  13. * this program. If not, see <http://www.gnu.org/licenses/>.
  14. */
  15. package com.l2jserver.gameserver.model;
  16. import java.util.List;
  17. import java.util.logging.Logger;
  18. import javolution.util.FastList;
  19. import com.l2jserver.util.Rnd;
  20. /**
  21. * @version 0.1, 2005-03-12
  22. * @author Balancer
  23. */
  24. public class L2Territory
  25. {
  26. private static Logger _log = Logger.getLogger(L2Territory.class.getName());
  27. protected static class Point
  28. {
  29. protected int _x, _y, _zmin, _zmax, _proc;
  30. Point (int x, int y, int zmin, int zmax, int proc)
  31. {
  32. _x=x;
  33. _y=y;
  34. _zmin=zmin;
  35. _zmax=zmax;
  36. _proc=proc;
  37. }
  38. }
  39. private List<Point> _points;
  40. private int _terr;
  41. private int _xMin;
  42. private int _xMax;
  43. private int _yMin;
  44. private int _yMax;
  45. private int _zMin;
  46. private int _zMax;
  47. private int _procMax;
  48. public L2Territory(int terr)
  49. {
  50. _points = new FastList<>();
  51. _terr = terr;
  52. _xMin = 999999;
  53. _xMax =-999999;
  54. _yMin = 999999;
  55. _yMax =-999999;
  56. _zMin = 999999;
  57. _zMax =-999999;
  58. _procMax = 0;
  59. }
  60. public void add(int x, int y, int zmin, int zmax, int proc)
  61. {
  62. _points.add(new Point(x,y,zmin,zmax,proc));
  63. if(x<_xMin) _xMin = x;
  64. if(y<_yMin) _yMin = y;
  65. if(x>_xMax) _xMax = x;
  66. if(y>_yMax) _yMax = y;
  67. if(zmin<_zMin) _zMin = zmin;
  68. if(zmax>_zMax) _zMax = zmax;
  69. _procMax += proc;
  70. }
  71. public void print()
  72. {
  73. for(Point p : _points)
  74. _log.info("(" + p._x + "," + p._y + ")");
  75. }
  76. public boolean isIntersect(int x, int y, Point p1, Point p2)
  77. {
  78. double dy1 = p1._y - y;
  79. double dy2 = p2._y - y;
  80. if(Math.signum(dy1) == Math.signum(dy2))
  81. return false;
  82. double dx1 = p1._x - x;
  83. double dx2 = p2._x - x;
  84. if(dx1 >= 0 && dx2 >= 0)
  85. return true;
  86. if(dx1 < 0 && dx2 < 0)
  87. return false;
  88. double dx0 = (dy1 * (p1._x-p2._x))/(p1._y-p2._y);
  89. return dx0 <= dx1;
  90. }
  91. public boolean isInside(int x, int y)
  92. {
  93. int intersect_count = 0;
  94. for(int i=0; i<_points.size(); i++)
  95. {
  96. Point p1 = _points.get(i>0 ? i-1 : _points.size()-1);
  97. Point p2 = _points.get(i);
  98. if(isIntersect(x,y,p1,p2))
  99. intersect_count++;
  100. }
  101. return intersect_count%2 == 1;
  102. }
  103. public int[] getRandomPoint()
  104. {
  105. int[] p = new int[4];
  106. if ( _procMax>0)
  107. {
  108. int pos = 0;
  109. int rnd = Rnd.nextInt(_procMax);
  110. for(Point p1: _points)
  111. {
  112. pos += p1._proc;
  113. if ( rnd <= pos )
  114. {
  115. p[0] = p1._x;
  116. p[1] = p1._y;
  117. p[2] = p1._zmin;
  118. p[3] = p1._zmax;
  119. return p;
  120. }
  121. }
  122. }
  123. for(int i=0; i<100; i++)
  124. {
  125. p[0] = Rnd.get(_xMin, _xMax);
  126. p[1] = Rnd.get(_yMin, _yMax);
  127. if(isInside(p[0],p[1]))
  128. {
  129. double curdistance = 0;
  130. p[2] = _zMin+100;
  131. p[3] = _zMax;
  132. for(Point p1: _points)
  133. {
  134. double dx = p1._x-p[0];
  135. double dy = p1._y-p[1];
  136. double distance = Math.sqrt(dx*dx+dy*dy);
  137. if (curdistance == 0 || distance < curdistance)
  138. {
  139. curdistance = distance;
  140. p[2] = p1._zmin+100;
  141. }
  142. }
  143. return p;
  144. }
  145. }
  146. _log.warning("Can't make point for territory " + _terr);
  147. return p;
  148. }
  149. public int getProcMax()
  150. {
  151. return _procMax;
  152. }
  153. }