Guest User

Dimension

a guest
Feb 16th, 2016
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.68 KB | None | 0 0
  1. Teleporter:
  2. -------------
  3. public class TeleporterEthia extends Teleporter
  4. {
  5. private final WorldServer worldServerInstance;
  6.  
  7. public TeleporterEthia(WorldServer worldserver)
  8. {
  9. super(worldserver);
  10. this.worldServerInstance = worldserver;
  11. }
  12.  
  13. public void placeInPortal(Entity entity, float rotationYaw)
  14. {
  15. int i = MathHelper.floor_double(entity.posX);
  16. int j = MathHelper.floor_double(entity.posY) - 1;
  17. int k = MathHelper.floor_double(entity.posZ);
  18. byte b0 = 1;
  19. byte b1 = 0;
  20.  
  21. for (int l = -2; l <= 2; ++l)
  22. {
  23. for (int i1 = -2; i1 <= 2; ++i1)
  24. {
  25. for (int j1 = -1; j1 < 3; ++j1)
  26. {
  27. int k1 = i + i1 * b0 + l * b1;
  28. int l1 = j + j1;
  29. int i2 = k + i1 * b1 - l * b0;
  30. boolean flag = j1 < 0;
  31. this.worldServerInstance.setBlockState(new BlockPos(k1, l1, i2), flag ? Blocks.stonebrick.getDefaultState() :
  32. Blocks.air.getDefaultState());
  33. }
  34. }
  35. }
  36.  
  37. entity.setLocationAndAngles((double) i, (double) j, (double) k, entity.rotationYaw, 0.0F);
  38. entity.motionX = entity.motionY = entity.motionZ = 0.0D;
  39. }
  40. }
  41.  
  42. World Provider:
  43. ---------------
  44. public class WorldProviderEthia extends WorldProvider
  45. {
  46. public void registerWorldChunkManager()
  47. {
  48. this.worldChunkMgr = new WorldChunkManagerEthia(Ethia.skyWorld, 0.0F);
  49. this.dimensionId = Ethia.getEthiaDimensionId();
  50. }
  51.  
  52. public IChunkProvider createChunkGenerator()
  53. {
  54. return new ChunkProviderEthia(this.worldObj, this.worldObj.getSeed());
  55. }
  56.  
  57. public boolean isSurfaceWorld()
  58. {
  59. return false;
  60. }
  61.  
  62. @SideOnly(Side.CLIENT)
  63. public float getCloudHeight()
  64. {
  65. return 8.0F;
  66. }
  67.  
  68. public boolean canCoordinateBeSpawn(int x, int z)
  69. {
  70. return this.worldObj.getGroundAboveSeaLevel(new BlockPos(x, 0, z)).getMaterial().blocksMovement();
  71. }
  72.  
  73. public BlockPos getSpawnCoordinate()
  74. {
  75. return new BlockPos(100, 50, 0);
  76. }
  77.  
  78. public int getAverageGroundLevel()
  79. {
  80. return 40;
  81. }
  82.  
  83. public boolean doesXZShowFog(int x, int z)
  84. {
  85. return true;
  86. }
  87.  
  88. public String getDimensionName()
  89. {
  90. return "Ethia";
  91. }
  92.  
  93. public String getInternalNameSuffix()
  94. {
  95. return "_ethia";
  96. }
  97. }
  98.  
  99. Biome Decorator:
  100. ----------------
  101. public class BiomeEthiaDecorator extends BiomeDecorator
  102. {
  103. protected void genDecorations(BiomeGenBase biomegenbase)
  104. {
  105. WorldHelper.genOre(this.currentWorld, EthiaBlocks.floiar_ore, this.randomGenerator, 10, 0, 128);
  106. WorldHelper.genOre(this.currentWorld, EthiaBlocks.xantinum_ore, this.randomGenerator, 6, 0, 32);
  107. int i = this.treesPerChunk;
  108.  
  109. if (this.randomGenerator.nextInt(10) == 0)
  110. {
  111. ++i;
  112. }
  113.  
  114. for (int j = 0; j < i; ++j)
  115. {
  116. int chunkX = this.randomGenerator.nextInt(16) + 8;
  117. int chunkZ = this.randomGenerator.nextInt(16) + 8;
  118. WorldGenAbstractTree worldgenabstracttree = biomegenbase.genBigTreeChance(this.randomGenerator);
  119. worldgenabstracttree.func_175904_e();
  120. BlockPos blockpos = this.currentWorld.getHorizon(this.field_180294_c.add(chunkX, 0, chunkZ));
  121.  
  122. if (worldgenabstracttree.generate(this.currentWorld, this.randomGenerator, blockpos))
  123. {
  124. worldgenabstracttree.func_180711_a(this.currentWorld, this.randomGenerator, blockpos);
  125. }
  126. }
  127. }
  128. }
  129.  
  130. Biome Gen Base:
  131. ---------------
  132. public class BiomeGenEthia extends BiomeGenBase
  133. {
  134. public BiomeGenEthia(int id)
  135. {
  136. super(id);
  137. this.spawnableMonsterList.clear();
  138. this.spawnableCreatureList.clear();
  139. this.spawnableWaterCreatureList.clear();
  140. this.spawnableCaveCreatureList.clear();
  141. this.topBlock = Blocks.grass.getDefaultState();
  142. this.fillerBlock = Blocks.dirt.getDefaultState();
  143. this.theBiomeDecorator = new BiomeEthiaDecorator();
  144. }
  145.  
  146. public WorldGenAbstractTree genBigTreeChance(Random rand)
  147. {
  148. return new WorldGenEthiaTree();
  149. }
  150. }
  151.  
  152. World Chunk Manager:
  153. --------------------
  154. public class WorldChunkManagerEthia extends WorldChunkManager
  155. {
  156. private BiomeGenBase biomeGenerator;
  157. private float rainfall;
  158.  
  159. public WorldChunkManagerEthia(BiomeGenBase biomeGen, float rainfall)
  160. {
  161. this.biomeGenerator = biomeGen;
  162. this.rainfall = rainfall;
  163. }
  164.  
  165. public BiomeGenBase getBiomeGenerator(BlockPos blockpos)
  166. {
  167. return this.biomeGenerator;
  168. }
  169.  
  170. public BiomeGenBase[] getBiomesForGeneration(BiomeGenBase[] abiomegenbase, int x, int z, int width, int height)
  171. {
  172. if (abiomegenbase == null || abiomegenbase.length < width * height)
  173. {
  174. abiomegenbase = new BiomeGenBase[width * height];
  175. }
  176.  
  177. Arrays.fill(abiomegenbase, 0, width * height, this.biomeGenerator);
  178. return abiomegenbase;
  179. }
  180.  
  181. public float[] getRainfall(float[] listToReuse, int x, int z, int width, int length)
  182. {
  183. if (listToReuse == null || listToReuse.length < width * length)
  184. {
  185. listToReuse = new float[width * length];
  186. }
  187.  
  188. Arrays.fill(listToReuse, 0, width * length, this.rainfall);
  189. return listToReuse;
  190. }
  191.  
  192. public BiomeGenBase[] loadBlockGeneratorData(BiomeGenBase[] oldBiomeList, int x, int z, int width, int depth)
  193. {
  194. if (oldBiomeList == null || oldBiomeList.length < width * depth)
  195. {
  196. oldBiomeList = new BiomeGenBase[width * depth];
  197. }
  198.  
  199. Arrays.fill(oldBiomeList, 0, width * depth, this.biomeGenerator);
  200. return oldBiomeList;
  201. }
  202.  
  203. public BiomeGenBase[] getBiomeGenAt(BiomeGenBase[] listToReuse, int x, int z, int width, int length, boolean cacheFlag)
  204. {
  205. return this.loadBlockGeneratorData(listToReuse, x, z, width, length);
  206. }
  207.  
  208. public BlockPos findBiomePosition(int x, int z, int range, List biomes, Random random)
  209. {
  210. return biomes.contains(this.biomeGenerator) ? new BlockPos(x - range + random.nextInt(range * 2 + 1), 0, z - range +
  211. random.nextInt(range * 2 + 1)) : null;
  212. }
  213.  
  214. public boolean areBiomesViable(int x, int z, int range, List biomes)
  215. {
  216. return biomes.contains(this.biomeGenerator);
  217. }
  218. }
  219.  
  220. Chunk Provider:
  221. ---------------
  222. public class ChunkProviderEthia implements IChunkProvider
  223. {
  224. private Random ethiaRNG;
  225. private NoiseGeneratorOctaves noiseGen1;
  226. private NoiseGeneratorOctaves noiseGen2;
  227. private NoiseGeneratorOctaves noiseGen3;
  228. public NoiseGeneratorOctaves noiseGen4;
  229. public NoiseGeneratorOctaves noiseGen5;
  230. private World ethiaWorld;
  231. private double[] densities;
  232. private BiomeGenBase[] biomesForGeneration;
  233. double[] noiseData1;
  234. double[] noiseData2;
  235. double[] noiseData3;
  236. double[] noiseData4;
  237. double[] noiseData5;
  238.  
  239. public ChunkProviderEthia(World world, long seed)
  240. {
  241. this.ethiaWorld = world;
  242. this.ethiaRNG = new Random(seed);
  243. this.noiseGen1 = new NoiseGeneratorOctaves(this.ethiaRNG, 16);
  244. this.noiseGen2 = new NoiseGeneratorOctaves(this.ethiaRNG, 16);
  245. this.noiseGen3 = new NoiseGeneratorOctaves(this.ethiaRNG, 8);
  246. this.noiseGen4 = new NoiseGeneratorOctaves(this.ethiaRNG, 10);
  247. this.noiseGen5 = new NoiseGeneratorOctaves(this.ethiaRNG, 16);
  248. }
  249.  
  250. public void func_180520_a(int x, int z, ChunkPrimer chunkprimer)
  251. {
  252. byte b0 = 2;
  253. int k = b0 + 1;
  254. byte b1 = 33;
  255. int l = b0 + 1;
  256. this.densities = this.initializeNoiseField(this.densities, x * b0, 0, z * b0, k, b1, l);
  257.  
  258. for (int i1 = 0; i1 < b0; ++i1)
  259. {
  260. for (int j1 = 0; j1 < b0; ++j1)
  261. {
  262. for (int k1 = 0; k1 < 32; ++k1)
  263. {
  264. double d0 = 0.25D;
  265. double d1 = this.densities[((i1 + 0) * l + j1 + 0) * b1 + k1 + 0];
  266. double d2 = this.densities[((i1 + 0) * l + j1 + 1) * b1 + k1 + 0];
  267. double d3 = this.densities[((i1 + 1) * l + j1 + 0) * b1 + k1 + 0];
  268. double d4 = this.densities[((i1 + 1) * l + j1 + 1) * b1 + k1 + 0];
  269. double d5 = (this.densities[((i1 + 0) * l + j1 + 0) * b1 + k1 + 1] - d1) * d0;
  270. double d6 = (this.densities[((i1 + 0) * l + j1 + 1) * b1 + k1 + 1] - d2) * d0;
  271. double d7 = (this.densities[((i1 + 1) * l + j1 + 0) * b1 + k1 + 1] - d3) * d0;
  272. double d8 = (this.densities[((i1 + 1) * l + j1 + 1) * b1 + k1 + 1] - d4) * d0;
  273.  
  274. for (int l1 = 0; l1 < 4; ++l1)
  275. {
  276. double d9 = 0.125D;
  277. double d10 = d1;
  278. double d11 = d2;
  279. double d12 = (d3 - d1) * d9;
  280. double d13 = (d4 - d2) * d9;
  281.  
  282. for (int i2 = 0; i2 < 8; ++i2)
  283. {
  284. double d14 = 0.125D;
  285. double d15 = d10;
  286. double d16 = (d11 - d10) * d14;
  287.  
  288. for (int j2 = 0; j2 < 8; ++j2)
  289. {
  290. IBlockState iblockstate = null;
  291.  
  292. if (d15 > 0.0D)
  293. {
  294. iblockstate = Blocks.grass.getDefaultState();
  295. }
  296.  
  297. int k2 = i2 + i1 * 8;
  298. int l2 = l1 + k1 * 4;
  299. int i3 = j2 + j1 * 8;
  300. chunkprimer.setBlockState(k2, l2, i3, iblockstate);
  301. }
  302.  
  303. d10 += d12;
  304. d11 += d13;
  305. }
  306.  
  307. d1 += d5;
  308. d2 += d6;
  309. d3 += d7;
  310. d4 += d8;
  311. }
  312. }
  313. }
  314. }
  315. }
  316.  
  317. public void func_180519_a(ChunkPrimer chunkprimer)
  318. {
  319. for (int i = 0; i < 16; ++i)
  320. {
  321. for (int j = 0; j < 16; ++j)
  322. {
  323. byte b0 = 1;
  324. int k = -1;
  325. IBlockState iblockstate = Blocks.grass.getDefaultState();
  326. IBlockState iblockstate1 = Blocks.dirt.getDefaultState();
  327.  
  328. for (int l = 127; l >= 0; --l)
  329. {
  330. IBlockState iblockstate2 = chunkprimer.getBlockState(i, l, j);
  331.  
  332. if (iblockstate2.getBlock().getMaterial() == Material.air)
  333. {
  334. k = -1;
  335. }
  336. else if (iblockstate2.getBlock() == Blocks.stone)
  337. {
  338. if (k == -1)
  339. {
  340. if (b0 <= 0)
  341. {
  342. iblockstate = Blocks.air.getDefaultState();
  343. iblockstate1 = Blocks.grass.getDefaultState();
  344. }
  345.  
  346. k = b0;
  347.  
  348. if (l >= 0)
  349. {
  350. chunkprimer.setBlockState(i, l, j, iblockstate);
  351. }
  352. else
  353. {
  354. chunkprimer.setBlockState(i, l, j, iblockstate1);
  355. }
  356. }
  357. else if (k > 0)
  358. {
  359. --k;
  360. chunkprimer.setBlockState(i, l, j, iblockstate1);
  361. }
  362. }
  363. }
  364. }
  365. }
  366. }
  367.  
  368. public Chunk provideChunk(int x, int z)
  369. {
  370. this.ethiaRNG.setSeed((long) x * 341873128712L + (long) z * 132897987541L);
  371. ChunkPrimer chunkprimer = new ChunkPrimer();
  372. this.biomesForGeneration = this.ethiaWorld.getWorldChunkManager().loadBlockGeneratorData(this.biomesForGeneration, x * 16, z *
  373. 16, 16, 16);
  374. this.func_180520_a(x, z, chunkprimer);
  375. this.func_180519_a(chunkprimer);
  376. Chunk chunk = new Chunk(this.ethiaWorld, chunkprimer, x, z);
  377. byte[] abyte = chunk.getBiomeArray();
  378.  
  379. for (int k = 0; k < abyte.length; ++k)
  380. {
  381. abyte[k] = (byte) this.biomesForGeneration[k].biomeID;
  382. }
  383.  
  384. chunk.generateSkylightMap();
  385. return chunk;
  386. }
  387.  
  388. private double[] initializeNoiseField(double[] densities, int x, int y, int z, int xSize, int ySize, int zSize)
  389. {
  390. if (densities == null)
  391. {
  392. densities = new double[xSize * ySize * zSize];
  393. }
  394.  
  395. double d0 = 684.412D;
  396. double d1 = 684.412D;
  397. this.noiseData4 = this.noiseGen4.generateNoiseOctaves(this.noiseData4, x, z, xSize, zSize, 1.121D, 1.121D, 0.5D);
  398. this.noiseData5 = this.noiseGen5.generateNoiseOctaves(this.noiseData5, x, z, xSize, zSize, 200.0D, 200.0D, 0.5D);
  399. d0 *= 2.0D;
  400. this.noiseData1 = this.noiseGen3.generateNoiseOctaves(this.noiseData1, x, y, z, xSize, ySize, zSize, d0 / 80.0D, d1 / 160.0D,
  401. d0 / 80.0D);
  402. this.noiseData2 = this.noiseGen1.generateNoiseOctaves(this.noiseData2, x, y, z, xSize, ySize, zSize, d0, d1, d0);
  403. this.noiseData3 = this.noiseGen2.generateNoiseOctaves(this.noiseData3, x, y, z, xSize, ySize, zSize, d0, d1, d0);
  404. int k1 = 0;
  405.  
  406. for (int l1 = 0; l1 < xSize; ++l1)
  407. {
  408. for (int i2 = 0; i2 < zSize; ++i2)
  409. {
  410. float f = (float) (l1 + xSize) / 1.0F;
  411. float f1 = (float) (i2 + zSize) / 1.0F;
  412. float f2 = 100.0F - MathHelper.sqrt_float(f * f + f1 * f1) * 8.0F;
  413.  
  414. if (f2 > 80.0F)
  415. {
  416. f2 = 80.0F;
  417. }
  418.  
  419. if (f2 < -100.0F)
  420. {
  421. f2 = -100.0F;
  422. }
  423.  
  424. for (int j2 = 0; j2 < ySize; ++j2)
  425. {
  426. double d2 = 0.0D;
  427. double d3 = this.noiseData2[k1] / 512.0D;
  428. double d4 = this.noiseData3[k1] / 512.0D;
  429. double d5 = (this.noiseData1[k1] / 10.0D + 1.0D) / 2.0D;
  430.  
  431. if (d5 < 0.0D)
  432. {
  433. d2 = d3;
  434. }
  435. else if (d5 > 1.0D)
  436. {
  437. d2 = d4;
  438. }
  439. else
  440. {
  441. d2 = d3 + (d4 - d3) * d5;
  442. }
  443.  
  444. d2 -= 8.0D;
  445. d2 += (double) f2;
  446. byte b0 = 2;
  447. double d6;
  448.  
  449. if (j2 > ySize / 2 - b0)
  450. {
  451. d6 = (double) ((float) (j2 - (ySize / 2 - b0)) / 64.0F);
  452. d6 = MathHelper.clamp_double(d6, 0.0D, 1.0D);
  453. d2 = d2 * (1.0D - d6) + -3000.0D * d6;
  454. }
  455.  
  456. b0 = 8;
  457.  
  458. if (j2 < b0)
  459. {
  460. d6 = (double) ((float) (b0 - j2) / ((float) b0 - 1.0F));
  461. d2 = d2 * (1.0D - d6) + -30.0D * d6;
  462. }
  463.  
  464. densities[k1] = d2;
  465. ++k1;
  466. }
  467. }
  468. }
  469.  
  470. return densities;
  471. }
  472.  
  473. public boolean chunkExists(int x, int z)
  474. {
  475. return true;
  476. }
  477.  
  478. public void populate(IChunkProvider ichunkprovider, int x, int z)
  479. {
  480. BlockFalling.fallInstantly = true;
  481. BlockPos blockpos = new BlockPos(x * 16, 0, z * 16);
  482. this.ethiaWorld.getBiomeGenForCoords(blockpos.add(16, 0, 16)).decorate(this.ethiaWorld, this.ethiaRNG, blockpos);
  483. BlockFalling.fallInstantly = false;
  484. }
  485.  
  486. public boolean func_177460_a(IChunkProvider ichunkprovider, Chunk chunk, int x, int z)
  487. {
  488. return false;
  489. }
  490.  
  491. public boolean saveChunks(boolean flag, IProgressUpdate iprogressupdate)
  492. {
  493. return true;
  494. }
  495.  
  496. public void saveExtraData() {}
  497.  
  498. public boolean unloadQueuedChunks()
  499. {
  500. return false;
  501. }
  502.  
  503. public boolean canSave()
  504. {
  505. return true;
  506. }
  507.  
  508. public String makeString()
  509. {
  510. return "RandomLevelSource";
  511. }
  512.  
  513. public List func_177458_a(EnumCreatureType enumcreaturetype, BlockPos blockpos)
  514. {
  515. return this.ethiaWorld.getBiomeGenForCoords(blockpos).getSpawnableList(enumcreaturetype);
  516. }
  517.  
  518. public BlockPos getStrongholdGen(World world, String s, BlockPos blockpos)
  519. {
  520. return null;
  521. }
  522.  
  523. public int getLoadedChunkCount()
  524. {
  525. return 0;
  526. }
  527.  
  528. public void recreateStructures(Chunk chunk, int x, int z) {}
  529.  
  530. public Chunk provideChunk(BlockPos blockpos)
  531. {
  532. return this.provideChunk(blockpos.getX() >> 4, blockpos.getZ() >> 4);
  533. }
  534. }
  535.  
  536. World Gen Tree:
  537. ---------------
  538. public class WorldGenEthiaTree extends WorldGenAbstractTree
  539. {
  540. public WorldGenEthiaTree()
  541. {
  542. super(false);
  543. }
  544.  
  545. public boolean generate(World world, Random rand, BlockPos pos)
  546. {
  547. Block block = world.getBlockState(pos).getBlock();
  548. int branches = 3 + rand.nextInt(6);
  549. int h = 1;
  550. block.onPlantGrow(world, new BlockPos(pos.getX(), pos.getY() - 1, pos.getZ()), pos);
  551.  
  552. for (int i = 0; i < branches; ++i)
  553. {
  554. for (int x1 = pos.getX() - 1; x1 <= pos.getX() + 1; ++x1)
  555. {
  556. int x2 = pos.getX() - x1;
  557.  
  558. for (int z1 = pos.getZ() - 1; z1 <= pos.getZ() + 1; ++z1)
  559. {
  560. this.setBlock(world, new BlockPos(x1, pos.getY() + h + 1, z1), EthiaBlocks.ethiroot_leaves, 0);
  561. }
  562. }
  563.  
  564. for (int x1 = pos.getX() - 2; x1 <= pos.getX() + 2; ++x1)
  565. {
  566. int x2 = pos.getX() - x1;
  567.  
  568. for (int z1 = pos.getZ() - 2; z1 <= pos.getZ() + 2; ++z1)
  569. {
  570. int z2 = pos.getZ() - z1;
  571.  
  572. if (!(Math.abs(x2) == 2 && Math.abs(z2) == 2) && !(Math.abs(x2) == 2 && Math.abs(z2) == 1) && !(Math.abs(x2) == 1
  573. && Math.abs(z2) == 2) && !(Math.abs(x2) == 1 && Math.abs(z2) == 1))
  574. {
  575. this.setBlock(world, new BlockPos(x1, pos.getY() + h, z1), EthiaBlocks.ethiroot_leaves, world.rand.nextInt(10)
  576. == 0 ? 1 : 0);
  577. }
  578. }
  579. }
  580.  
  581. h += 2;
  582. }
  583.  
  584. for (int x = pos.getX() - 2; x <= pos.getX() + 2; ++x)
  585. {
  586. int x1 = pos.getX() - x;
  587.  
  588. for (int y = pos.getY() + h; y <= pos.getY() + h + 2; ++y)
  589. {
  590. int y1 = pos.getY() + h - y;
  591.  
  592. for (int z = pos.getZ() - 2; z <= pos.getZ() + 2; ++z)
  593. {
  594. int z1 = pos.getZ() - z;
  595.  
  596. if (y1 == 0)
  597. {
  598. if (!(Math.abs(x1) == 2 && Math.abs(z1) == 2) && !(Math.abs(x1) == 2 && Math.abs(z1) == 1) && !(Math.abs(x1) ==
  599. 1 && Math.abs(z1) == 2) && !(Math.abs(x1) == 1 && Math.abs(z1) == 1))
  600. {
  601. this.setBlock(world, new BlockPos(x, y, z), EthiaBlocks.ethiroot_leaves, world.rand.nextInt(10) == 0 ? 1 :
  602. 0);
  603. }
  604. }
  605. else
  606. {
  607. if (x1 == 0 && z1 == 0)
  608. {
  609. this.setBlock(world, new BlockPos(x, y, z), EthiaBlocks.ethiroot_leaves, 0);
  610. }
  611. }
  612. }
  613. }
  614. }
  615.  
  616. for (int y1 = 0; y1 <= h; ++ y1)
  617. {
  618. this.setBlock(world, new BlockPos(pos.getX(), pos.getY() + y1, pos.getZ()), EthiaBlocks.ethiroot_log, 0);
  619. }
  620.  
  621. return true;
  622. }
  623.  
  624. private void setBlock(World world, BlockPos pos, Block block, int meta)
  625. {
  626. this.func_175905_a(world, pos, block, meta);
  627. }
  628. }
  629.  
  630. Main Class Methods:
  631. -------------------
  632. public static final BiomeGenBase skyWorld = (new BiomeGenEthia(120)).setColor(318792131).setBiomeName("Ethia").setDisableRain();
  633.  
  634. @EventHandler
  635. public void init(FMLInitializationEvent event)
  636. {
  637. DimensionManager.registerProviderType(getEthiaDimensionId(), WorldProviderEthia.class, false);
  638. DimensionManager.registerDimension(getEthiaDimensionId(), getEthiaDimensionId());
  639. }
  640.  
  641. public static int getEthiaDimensionId()
  642. {
  643. return 2;
  644. }
Add Comment
Please, Sign In to add comment