L2Territory.java 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  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. /**
  16. coded by Balancer
  17. balancer@balancer.ru
  18. http://balancer.ru
  19. version 0.1, 2005-03-12
  20. */
  21. package net.sf.l2j.gameserver.model;
  22. import java.util.List;
  23. import java.util.logging.Logger;
  24. import javolution.util.FastList;
  25. import net.sf.l2j.util.Rnd;
  26. public class L2Territory
  27. {
  28. private static Logger _log = Logger.getLogger(L2Territory.class.getName());
  29. protected class Point
  30. {
  31. protected int _x, _y, _zmin, _zmax, _proc;
  32. Point (int x, int y, int zmin, int zmax, int proc) {_x=x; _y=y; _zmin=zmin; _zmax=zmax; _proc=proc;}
  33. }
  34. private List<Point> _points;
  35. private int _terr;
  36. private int _xMin;
  37. private int _xMax;
  38. private int _yMin;
  39. private int _yMax;
  40. private int _zMin;
  41. private int _zMax;
  42. private int _procMax;
  43. public L2Territory(int terr)
  44. {
  45. _points = new FastList<Point>();
  46. _terr = terr;
  47. _xMin = 999999;
  48. _xMax =-999999;
  49. _yMin = 999999;
  50. _yMax =-999999;
  51. _zMin = 999999;
  52. _zMax =-999999;
  53. _procMax = 0;
  54. }
  55. public void add(int x, int y, int zmin, int zmax, int proc)
  56. {
  57. _points.add(new Point(x,y,zmin,zmax,proc));
  58. if(x<_xMin) _xMin = x;
  59. if(y<_yMin) _yMin = y;
  60. if(x>_xMax) _xMax = x;
  61. if(y>_yMax) _yMax = y;
  62. if(zmin<_zMin) _zMin = zmin;
  63. if(zmax>_zMax) _zMax = zmax;
  64. _procMax += proc;
  65. }
  66. public void print()
  67. {
  68. for(Point p : _points)
  69. _log.info("("+p._x+","+p._y+")");
  70. }
  71. public boolean isIntersect(int x, int y, Point p1, Point p2)
  72. {
  73. double dy1 = p1._y - y;
  74. double dy2 = p2._y - y;
  75. if(Math.signum(dy1) == Math.signum(dy2))
  76. return false;
  77. double dx1 = p1._x - x;
  78. double dx2 = p2._x - x;
  79. if(dx1 >= 0 && dx2 >= 0)
  80. return true;
  81. if(dx1 < 0 && dx2 < 0)
  82. return false;
  83. double dx0 = (dy1 * (p1._x-p2._x))/(p1._y-p2._y);
  84. return dx0 <= dx1;
  85. }
  86. public boolean isInside(int x, int y)
  87. {
  88. int intersect_count = 0;
  89. for(int i=0; i<_points.size(); i++)
  90. {
  91. Point p1 = _points.get(i>0 ? i-1 : _points.size()-1);
  92. Point p2 = _points.get(i);
  93. if(isIntersect(x,y,p1,p2))
  94. intersect_count++;
  95. }
  96. return intersect_count%2 == 1;
  97. }
  98. public int[] getRandomPoint()
  99. {
  100. int i;
  101. int[] p = new int[4];
  102. if ( _procMax>0) {
  103. int pos = 0;
  104. int rnd = Rnd.nextInt(_procMax);
  105. for( i=0; i<_points.size(); i++){
  106. Point p1 = _points.get(i);
  107. pos += p1._proc;
  108. if ( rnd <= pos ){
  109. p[0] = p1._x; p[1] = p1._y;
  110. p[2] = p1._zmin; p[3] = p1._zmax;
  111. return p;
  112. }
  113. }
  114. }
  115. for( i=0; i<100; i++)
  116. {
  117. p[0] = Rnd.get(_xMin, _xMax);
  118. p[1] = Rnd.get(_yMin, _yMax);
  119. if(isInside(p[0],p[1])){
  120. double curdistance = 0;
  121. p[2] = _zMin+100;p[3] = _zMax;
  122. for( i=0; i<_points.size(); i++){
  123. Point p1 = _points.get(i);
  124. double dx = p1._x-p[0];
  125. double dy = p1._y-p[1];
  126. double distance = Math.sqrt(dx*dx+dy*dy);
  127. if (curdistance == 0 || distance<curdistance){
  128. curdistance = distance;
  129. p[2] = p1._zmin+100;
  130. }
  131. }
  132. return p;
  133. }
  134. }
  135. _log.warning("Can't make point for territory"+_terr);
  136. return p;
  137. }
  138. public int getProcMax()
  139. {
  140. return _procMax;
  141. }
  142. }