mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-19 15:09:25 +00:00
Update changes from ver/1.21.4 branch
This commit is contained in:
2
.github/workflows/build-1215.yml
vendored
2
.github/workflows/build-1215.yml
vendored
@@ -97,7 +97,7 @@ jobs:
|
||||
path: ./leaf-1.21.5-${{ env.BUILD_NUMBER }}.jar
|
||||
|
||||
- name: Release Leaf
|
||||
uses: softprops/action-gh-release@master
|
||||
uses: softprops/action-gh-release@v2.2.2 # Temp fix
|
||||
with:
|
||||
name: "Leaf 1.21.5"
|
||||
tag_name: "ver-1.21.5"
|
||||
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -11,6 +11,7 @@
|
||||
# IntelliJ
|
||||
*.iml
|
||||
.idea
|
||||
!.idea/icon.svg
|
||||
|
||||
# Gradle
|
||||
!gradle/wrapper/gradle-wrapper.jar
|
||||
@@ -19,7 +20,7 @@ build
|
||||
|
||||
# Leaf
|
||||
build-data/dev-imports.txt
|
||||
patches/todo
|
||||
leaf-archived-patches/todo
|
||||
run
|
||||
|
||||
leaf-api/build.gradle.kts
|
||||
|
||||
143
.idea/icon.svg
generated
Normal file
143
.idea/icon.svg
generated
Normal file
@@ -0,0 +1,143 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="666px" height="665px" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g><path style="opacity:0.995" fill="#4fb95f" d="M 580.5,55.5 C 579.833,59.1667 579.167,62.8333 578.5,66.5C 494.167,149.165 410.167,232.832 326.5,317.5C 316.685,320.455 306.685,323.122 296.5,325.5C 375.833,245.833 455.167,166.167 534.5,86.5C 550.014,76.6672 565.014,66.0006 579.5,54.5C 580.107,54.6236 580.44,54.9569 580.5,55.5 Z"/></g>
|
||||
<g><path style="opacity:0.963" fill="#10894f" d="M 580.5,55.5 C 584.543,99.7391 586.21,144.072 585.5,188.5C 572.587,189.296 559.92,190.296 547.5,191.5C 554.386,179.841 559.72,167.508 563.5,154.5C 565.61,149.727 566.944,144.727 567.5,139.5C 570.542,132.248 572.208,124.582 572.5,116.5C 573.951,111.041 574.951,105.374 575.5,99.5C 576.313,93.1851 576.979,86.8518 577.5,80.5C 578.229,75.8696 578.563,71.2029 578.5,66.5C 579.167,62.8333 579.833,59.1667 580.5,55.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#4bb85c" d="M 578.5,66.5 C 578.563,71.2029 578.229,75.8696 577.5,80.5C 499.5,157.833 421.833,235.5 344.5,313.5C 339.644,314.544 334.978,315.877 330.5,317.5C 329.167,317.5 327.833,317.5 326.5,317.5C 410.167,232.832 494.167,149.165 578.5,66.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#48b759" d="M 577.5,80.5 C 576.979,86.8518 576.313,93.1851 575.5,99.5C 505.833,168.5 436.5,237.833 367.5,307.5C 360.055,309.946 352.389,311.946 344.5,313.5C 421.833,235.5 499.5,157.833 577.5,80.5 Z"/></g>
|
||||
<g><path style="opacity:0.996" fill="#52b962" d="M 534.5,86.5 C 455.167,166.167 375.833,245.833 296.5,325.5C 292.198,327.703 287.531,329.036 282.5,329.5C 359.833,251.833 437.167,174.167 514.5,96.5C 521.193,93.1534 527.86,89.8201 534.5,86.5 Z"/></g>
|
||||
<g><path style="opacity:0.997" fill="#55ba65" d="M 514.5,96.5 C 437.167,174.167 359.833,251.833 282.5,329.5C 271.675,333.735 260.675,337.735 249.5,341.5C 326.833,263.833 404.167,186.167 481.5,108.5C 492.79,105.292 503.79,101.292 514.5,96.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#45b756" d="M 575.5,99.5 C 574.951,105.374 573.951,111.041 572.5,116.5C 572.631,115.761 572.464,115.094 572,114.5C 508.963,177.034 446.796,239.701 385.5,302.5C 379.749,304.773 373.749,306.44 367.5,307.5C 436.5,237.833 505.833,168.5 575.5,99.5 Z"/></g>
|
||||
<g><path style="opacity:0.993" fill="#58bb68" d="M 481.5,108.5 C 404.167,186.167 326.833,263.833 249.5,341.5C 246.328,343.252 243.328,345.252 240.5,347.5C 228.697,353.316 217.697,360.316 207.5,368.5C 292.5,283.167 377.5,197.833 462.5,112.5C 468.868,111.325 475.201,109.991 481.5,108.5 Z"/></g>
|
||||
<g><path style="opacity:0.998" fill="#5cbc6c" d="M 462.5,112.5 C 377.5,197.833 292.5,283.167 207.5,368.5C 202.5,374.167 197.167,379.5 191.5,384.5C 156.167,419.5 120.833,454.5 85.5,489.5C 83.3256,486.485 81.6589,483.151 80.5,479.5C 201.5,358.167 322.5,236.833 443.5,115.5C 449.919,114.964 456.252,113.964 462.5,112.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#42b653" d="M 572.5,116.5 C 572.208,124.582 570.542,132.248 567.5,139.5C 516.034,189.462 464.701,240.296 413.5,292C 413.728,292.399 414.062,292.565 414.5,292.5C 405.195,296.603 395.529,299.936 385.5,302.5C 446.796,239.701 508.963,177.034 572,114.5C 572.464,115.094 572.631,115.761 572.5,116.5 Z"/></g>
|
||||
<g><path style="opacity:0.998" fill="#5fbc6e" d="M 443.5,115.5 C 322.5,236.833 201.5,358.167 80.5,479.5C 77.9922,475.818 75.9922,471.818 74.5,467.5C 191.5,351.167 308.167,234.5 424.5,117.5C 430.886,117.161 437.22,116.495 443.5,115.5 Z"/></g>
|
||||
<g><path style="opacity:0.998" fill="#62bd71" d="M 424.5,117.5 C 308.167,234.5 191.5,351.167 74.5,467.5C 72.9303,464.686 71.5969,461.686 70.5,458.5C 184.167,345.5 297.5,232.167 410.5,118.5C 415.181,118.331 419.848,117.998 424.5,117.5 Z"/></g>
|
||||
<g><path style="opacity:0.997" fill="#65bd74" d="M 410.5,118.5 C 297.5,232.167 184.167,345.5 70.5,458.5C 68.6385,454.25 66.9718,449.917 65.5,445.5C 174.5,337.167 283.167,228.5 391.5,119.5C 397.804,118.74 404.137,118.407 410.5,118.5 Z"/></g>
|
||||
<g><path style="opacity:0.996" fill="#7bc28a" d="M 290.5,119.5 C 210.833,199.833 130.833,279.833 50.5,359.5C 50.19,356.287 50.5233,353.287 51.5,350.5C 128.5,274.167 205.167,197.5 281.5,120.5C 284.57,120.632 287.57,120.299 290.5,119.5 Z"/></g>
|
||||
<g><path style="opacity:0.996" fill="#79c288" d="M 290.5,119.5 C 295.167,119.5 299.833,119.5 304.5,119.5C 220.5,204.167 136.167,288.5 51.5,372.5C 50.8005,368.202 50.4672,363.869 50.5,359.5C 130.833,279.833 210.833,199.833 290.5,119.5 Z"/></g>
|
||||
<g><path style="opacity:0.998" fill="#77c186" d="M 304.5,119.5 C 307.5,119.5 310.5,119.5 313.5,119.5C 226.5,207.167 139.167,294.5 51.5,381.5C 51.5,378.5 51.5,375.5 51.5,372.5C 136.167,288.5 220.5,204.167 304.5,119.5 Z"/></g>
|
||||
<g><path style="opacity:0.998" fill="#75c184" d="M 313.5,119.5 C 316.833,119.5 320.167,119.5 323.5,119.5C 233.5,210.167 143.167,300.5 52.5,390.5C 52.4921,387.455 52.1587,384.455 51.5,381.5C 139.167,294.5 226.5,207.167 313.5,119.5 Z"/></g>
|
||||
<g><path style="opacity:0.998" fill="#72c081" d="M 323.5,119.5 C 330.167,119.5 336.833,119.5 343.5,119.5C 247.833,215.833 151.833,311.833 55.5,407.5C 54.407,401.849 53.407,396.182 52.5,390.5C 143.167,300.5 233.5,210.167 323.5,119.5 Z"/></g>
|
||||
<g><path style="opacity:0.998" fill="#6fbf7e" d="M 343.5,119.5 C 348.833,119.5 354.167,119.5 359.5,119.5C 259.5,220.167 159.167,320.5 58.5,420.5C 57.1218,416.279 56.1218,411.946 55.5,407.5C 151.833,311.833 247.833,215.833 343.5,119.5 Z"/></g>
|
||||
<g><path style="opacity:0.998" fill="#6bbf7a" d="M 359.5,119.5 C 364.5,119.5 369.5,119.5 374.5,119.5C 270.5,224.167 166.167,328.5 61.5,432.5C 60.0966,428.619 59.0966,424.619 58.5,420.5C 159.167,320.5 259.5,220.167 359.5,119.5 Z"/></g>
|
||||
<g><path style="opacity:0.998" fill="#68be78" d="M 374.5,119.5 C 380.167,119.5 385.833,119.5 391.5,119.5C 283.167,228.5 174.5,337.167 65.5,445.5C 63.7681,441.303 62.4348,436.97 61.5,432.5C 166.167,328.5 270.5,224.167 374.5,119.5 Z"/></g>
|
||||
<g><path style="opacity:0.996" fill="#7ec28d" d="M 281.5,120.5 C 205.167,197.5 128.5,274.167 51.5,350.5C 51.4425,342.479 51.7758,334.479 52.5,326.5C 120.5,259.167 188.167,191.5 255.5,123.5C 264.099,122.063 272.766,121.063 281.5,120.5 Z"/></g>
|
||||
<g><path style="opacity:0.995" fill="#82c390" d="M 255.5,123.5 C 188.167,191.5 120.5,259.167 52.5,326.5C 53.4449,321.886 54.1115,317.219 54.5,312.5C 117.167,250.5 179.5,188.167 241.5,125.5C 246.132,124.617 250.798,123.95 255.5,123.5 Z"/></g>
|
||||
<g><path style="opacity:0.993" fill="#85c493" d="M 241.5,125.5 C 179.5,188.167 117.167,250.5 54.5,312.5C 55.8977,304.242 57.8977,296.242 60.5,288.5C 113.167,236.5 165.5,184.167 217.5,131.5C 225.404,129.191 233.404,127.191 241.5,125.5 Z"/></g>
|
||||
<g><path style="opacity:0.991" fill="#88c496" d="M 217.5,131.5 C 165.5,184.167 113.167,236.5 60.5,288.5C 61.5625,282.647 63.2292,276.98 65.5,271.5C 110.5,227.167 155.167,182.5 199.5,137.5C 205.215,134.928 211.215,132.928 217.5,131.5 Z"/></g>
|
||||
<g><path style="opacity:0.978" fill="#8bc599" d="M 199.5,137.5 C 155.167,182.5 110.5,227.167 65.5,271.5C 89.8075,206.526 134.474,161.859 199.5,137.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#3fb650" d="M 567.5,139.5 C 566.944,144.727 565.61,149.727 563.5,154.5C 520.701,196.799 478.035,239.299 435.5,282C 436.094,282.464 436.761,282.631 437.5,282.5C 430.241,286.626 422.575,289.959 414.5,292.5C 414.062,292.565 413.728,292.399 413.5,292C 464.701,240.296 516.034,189.462 567.5,139.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#3cb54d" d="M 563.5,154.5 C 559.72,167.508 554.386,179.841 547.5,191.5C 535.591,209.45 521.258,225.284 504.5,239C 483.473,255.513 461.14,270.013 437.5,282.5C 436.761,282.631 436.094,282.464 435.5,282C 478.035,239.299 520.701,196.799 563.5,154.5 Z"/></g>
|
||||
<g><path style="opacity:0.997" fill="#158d53" d="M 585.5,188.5 C 585.019,199.161 584.686,209.828 584.5,220.5C 578.846,219.547 573.18,219.714 567.5,221C 561.284,223.137 554.951,224.804 548.5,226C 542.866,229.436 536.866,232.102 530.5,234C 522.358,240.974 514.358,248.141 506.5,255.5C 503.02,263.453 498.187,270.453 492,276.5C 490.46,280.419 488.293,283.919 485.5,287C 478.328,292.038 471.328,296.704 464.5,301C 458.394,302.601 452.394,303.434 446.5,303.5C 442.654,303.545 438.987,304.378 435.5,306C 423.353,307.346 411.353,308.346 399.5,309C 397.238,309.642 395.071,310.475 393,311.5C 389.575,310.531 386.075,310.531 382.5,311.5C 362.015,316.658 341.682,322.324 321.5,328.5C 325.256,324.923 329.256,321.423 333.5,318C 332.552,317.517 331.552,317.351 330.5,317.5C 334.978,315.877 339.644,314.544 344.5,313.5C 352.389,311.946 360.055,309.946 367.5,307.5C 373.749,306.44 379.749,304.773 385.5,302.5C 395.529,299.936 405.195,296.603 414.5,292.5C 422.575,289.959 430.241,286.626 437.5,282.5C 461.14,270.013 483.473,255.513 504.5,239C 521.258,225.284 535.591,209.45 547.5,191.5C 559.92,190.296 572.587,189.296 585.5,188.5 Z"/></g>
|
||||
<g><path style="opacity:0.996" fill="#189156" d="M 584.5,220.5 C 583.786,226.818 583.12,233.151 582.5,239.5C 577.142,239.262 571.809,239.096 566.5,239C 558.011,242.244 549.345,244.911 540.5,247C 533.328,251.419 526.328,256.085 519.5,261C 513.127,267.042 506.46,272.708 499.5,278C 496.257,281.821 493.257,285.821 490.5,290C 484.569,293.639 478.569,297.306 472.5,301C 471.551,301.617 470.718,301.451 470,300.5C 465.12,303.683 459.787,305.683 454,306.5C 450.189,305.641 446.522,306.308 443,308.5C 441.862,308.011 440.695,307.678 439.5,307.5C 441.703,305.9 444.036,304.567 446.5,303.5C 452.394,303.434 458.394,302.601 464.5,301C 471.328,296.704 478.328,292.038 485.5,287C 488.293,283.919 490.46,280.419 492,276.5C 498.187,270.453 503.02,263.453 506.5,255.5C 514.358,248.141 522.358,240.974 530.5,234C 536.866,232.102 542.866,229.436 548.5,226C 554.951,224.804 561.284,223.137 567.5,221C 573.18,219.714 578.846,219.547 584.5,220.5 Z"/></g>
|
||||
<g><path style="opacity:0.998" fill="#1c9259" d="M 582.5,239.5 C 582.577,243.215 582.244,246.881 581.5,250.5C 574.515,251.332 567.515,252.165 560.5,253C 553.903,255.287 547.237,257.62 540.5,260C 533.038,266.126 525.038,271.46 516.5,276C 512.862,279.974 509.195,283.974 505.5,288C 496.593,294.56 487.926,301.56 479.5,309C 474.066,312.051 468.4,314.551 462.5,316.5C 452.106,319.683 441.606,322.683 431,325.5C 430.086,324.346 429.253,324.513 428.5,326C 406.626,329.758 385.293,334.924 364.5,341.5C 362.997,340.948 361.331,340.948 359.5,341.5C 366.409,338.344 372.742,334.177 378.5,329C 380.167,328.667 381.833,328.333 383.5,328C 390.74,321.769 399.074,317.769 408.5,316C 409.942,315.623 410.942,314.79 411.5,313.5C 413.17,313.249 414.67,312.582 416,311.5C 416.725,312.059 417.558,312.392 418.5,312.5C 425.031,311.332 431.198,309.332 437,306.5C 437.671,307.252 438.504,307.586 439.5,307.5C 440.695,307.678 441.862,308.011 443,308.5C 446.522,306.308 450.189,305.641 454,306.5C 459.787,305.683 465.12,303.683 470,300.5C 470.718,301.451 471.551,301.617 472.5,301C 478.569,297.306 484.569,293.639 490.5,290C 493.257,285.821 496.257,281.821 499.5,278C 506.46,272.708 513.127,267.042 519.5,261C 526.328,256.085 533.328,251.419 540.5,247C 549.345,244.911 558.011,242.244 566.5,239C 571.809,239.096 577.142,239.262 582.5,239.5 Z"/></g>
|
||||
<g><path style="opacity:0.996" fill="#1f975c" d="M 581.5,250.5 C 581.268,256.262 580.601,261.928 579.5,267.5C 572.516,268.372 565.516,268.539 558.5,268C 551.183,271.542 543.849,274.209 536.5,276C 518.549,287.221 501.049,299.055 484,311.5C 483.586,311.043 483.086,310.709 482.5,310.5C 473.203,316.265 463.203,320.265 452.5,322.5C 455.534,319.984 458.868,317.984 462.5,316.5C 468.4,314.551 474.066,312.051 479.5,309C 487.926,301.56 496.593,294.56 505.5,288C 509.195,283.974 512.862,279.974 516.5,276C 525.038,271.46 533.038,266.126 540.5,260C 547.237,257.62 553.903,255.287 560.5,253C 567.515,252.165 574.515,251.332 581.5,250.5 Z"/></g>
|
||||
<g><path style="opacity:0.998" fill="#23995f" d="M 579.5,267.5 C 579.632,270.57 579.299,273.57 578.5,276.5C 570.836,275.611 563.17,276.111 555.5,278C 553.996,279.788 552.329,280.288 550.5,279.5C 539.144,284.696 528.144,290.529 517.5,297C 512.559,301.787 507.225,305.954 501.5,309.5C 492.008,314.116 482.675,319.116 473.5,324.5C 464.054,326.891 455.054,330.391 446.5,335C 429.087,339.431 412.087,343.931 395.5,348.5C 397.647,346.53 399.98,344.697 402.5,343C 413.32,339.577 423.32,334.743 432.5,328.5C 439.339,327.11 446.006,325.11 452.5,322.5C 463.203,320.265 473.203,316.265 482.5,310.5C 483.086,310.709 483.586,311.043 484,311.5C 501.049,299.055 518.549,287.221 536.5,276C 543.849,274.209 551.183,271.542 558.5,268C 565.516,268.539 572.516,268.372 579.5,267.5 Z"/></g>
|
||||
<g><path style="opacity:0.994" fill="#279e62" d="M 578.5,276.5 C 577.927,282.511 577.26,288.511 576.5,294.5C 569.832,294.618 563.332,294.618 557,294.5C 551.996,296.404 546.663,298.404 541,300.5C 540.586,300.043 540.086,299.709 539.5,299.5C 535.712,301.472 532.212,303.805 529,306.5C 525.734,307.75 522.568,309.084 519.5,310.5C 504.932,318.535 490.432,326.868 476,335.5C 474.434,334.939 473.101,335.606 472,337.5C 471.667,337.167 471.333,336.833 471,336.5C 462.672,341.11 453.838,344.444 444.5,346.5C 444.937,344.926 445.937,343.759 447.5,343C 452.674,341.249 457.341,338.749 461.5,335.5C 471.609,329.942 481.609,324.109 491.5,318C 495.025,315.302 498.358,312.469 501.5,309.5C 507.225,305.954 512.559,301.787 517.5,297C 528.144,290.529 539.144,284.696 550.5,279.5C 552.329,280.288 553.996,279.788 555.5,278C 563.17,276.111 570.836,275.611 578.5,276.5 Z"/></g>
|
||||
<g><path style="opacity:0.993" fill="#2ea468" d="M 576.5,294.5 C 575.5,299.833 574.5,305.167 573.5,310.5C 569.781,310.632 566.281,309.965 563,308.5C 555.02,310.952 547.186,312.952 539.5,314.5C 535.841,315.413 532.341,316.746 529,318.5C 528.667,318.167 528.333,317.833 528,317.5C 507.995,329.78 487.162,340.446 465.5,349.5C 467.819,346.706 470.819,344.872 474.5,344C 476.487,341.481 478.653,339.981 481,339.5C 490.104,333.03 498.938,326.196 507.5,319C 512.446,317.373 516.446,314.539 519.5,310.5C 522.568,309.084 525.734,307.75 529,306.5C 532.212,303.805 535.712,301.472 539.5,299.5C 540.086,299.709 540.586,300.043 541,300.5C 546.663,298.404 551.996,296.404 557,294.5C 563.332,294.618 569.832,294.618 576.5,294.5 Z"/></g>
|
||||
<g><path style="opacity:0.913" fill="#269d61" d="M 607.5,403.5 C 607.5,382.5 607.5,361.5 607.5,340.5C 608.424,326.481 609.59,312.481 611,298.5C 616.361,333.851 615.195,368.851 607.5,403.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#198c56" d="M 446.5,303.5 C 444.036,304.567 441.703,305.9 439.5,307.5C 438.504,307.586 437.671,307.252 437,306.5C 431.198,309.332 425.031,311.332 418.5,312.5C 417.558,312.392 416.725,312.059 416,311.5C 414.67,312.582 413.17,313.249 411.5,313.5C 407.473,313.949 403.473,314.616 399.5,315.5C 397.72,314.085 396.054,314.252 394.5,316C 389.201,316.93 383.867,317.597 378.5,318C 373.338,319.752 368.171,321.585 363,323.5C 354.941,324.33 347.274,326.997 340,331.5C 339.586,331.043 339.086,330.709 338.5,330.5C 332.591,332.522 326.925,335.022 321.5,338C 316.315,339.007 311.315,340.507 306.5,342.5C 312.112,338.512 317.112,333.845 321.5,328.5C 341.682,322.324 362.015,316.658 382.5,311.5C 386.075,310.531 389.575,310.531 393,311.5C 395.071,310.475 397.238,309.642 399.5,309C 411.353,308.346 423.353,307.346 435.5,306C 438.987,304.378 442.654,303.545 446.5,303.5 Z"/></g>
|
||||
<g><path style="opacity:0.993" fill="#35ab6e" d="M 573.5,310.5 C 572.915,315.375 571.915,320.042 570.5,324.5C 558.326,323.424 546.326,324.924 534.5,329C 533.619,329.708 532.953,330.542 532.5,331.5C 518.899,336.055 506.065,342.722 494,351.5C 493.667,351.167 493.333,350.833 493,350.5C 488.236,353.869 483.236,356.869 478,359.5C 477.23,358.402 476.397,358.402 475.5,359.5C 489.057,348.697 502.723,337.864 516.5,327C 523.972,322.268 531.639,318.101 539.5,314.5C 547.186,312.952 555.02,310.952 563,308.5C 566.281,309.965 569.781,310.632 573.5,310.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#279862" d="M 501.5,309.5 C 498.358,312.469 495.025,315.302 491.5,318C 481.609,324.109 471.609,329.942 461.5,335.5C 444.852,340.859 428.519,346.193 412.5,351.5C 411.833,351.167 411.167,350.833 410.5,350.5C 404.727,352.311 399.227,354.644 394,357.5C 393.586,357.043 393.086,356.709 392.5,356.5C 384.438,360.235 376.438,363.235 368.5,365.5C 370.937,363.567 373.271,361.4 375.5,359C 380.165,356.668 384.498,353.835 388.5,350.5C 390.833,349.833 393.167,349.167 395.5,348.5C 412.087,343.931 429.087,339.431 446.5,335C 455.054,330.391 464.054,326.891 473.5,324.5C 482.675,319.116 492.008,314.116 501.5,309.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#2e9f68" d="M 519.5,310.5 C 516.446,314.539 512.446,317.373 507.5,319C 498.938,326.196 490.104,333.03 481,339.5C 478.653,339.981 476.487,341.481 474.5,344C 470.819,344.872 467.819,346.706 465.5,349.5C 462.199,349.792 460.199,351.459 459.5,354.5C 457.035,354.767 454.701,355.434 452.5,356.5C 445.638,358.386 438.971,360.886 432.5,364C 428.886,364.945 425.219,365.612 421.5,366C 419.579,366.36 417.912,367.194 416.5,368.5C 414.405,367.771 412.572,368.437 411,370.5C 410.667,370.167 410.333,369.833 410,369.5C 405.393,371.869 400.559,373.536 395.5,374.5C 403.208,367.644 411.875,362.311 421.5,358.5C 424.388,355.905 427.388,353.572 430.5,351.5C 435.372,350.397 440.038,348.73 444.5,346.5C 453.838,344.444 462.672,341.11 471,336.5C 471.333,336.833 471.667,337.167 472,337.5C 473.101,335.606 474.434,334.939 476,335.5C 490.432,326.868 504.932,318.535 519.5,310.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#1c8c59" d="M 411.5,313.5 C 410.942,314.79 409.942,315.623 408.5,316C 399.074,317.769 390.74,321.769 383.5,328C 381.833,328.333 380.167,328.667 378.5,329C 372.742,334.177 366.409,338.344 359.5,341.5C 357.337,343.083 355.004,344.416 352.5,345.5C 340.759,348.194 329.092,352.194 317.5,357.5C 312.072,358.103 306.905,360.103 302,363.5C 301.586,363.043 301.086,362.709 300.5,362.5C 295.938,364.518 291.271,366.351 286.5,368C 276.587,369.747 266.754,371.914 257,374.5C 256.235,374.43 255.735,374.097 255.5,373.5C 262.871,369.483 270.538,365.983 278.5,363C 285.458,356.859 292.791,351.359 300.5,346.5C 303.05,345.943 305.05,344.61 306.5,342.5C 311.315,340.507 316.315,339.007 321.5,338C 326.925,335.022 332.591,332.522 338.5,330.5C 339.086,330.709 339.586,331.043 340,331.5C 347.274,326.997 354.941,324.33 363,323.5C 368.171,321.585 373.338,319.752 378.5,318C 383.867,317.597 389.201,316.93 394.5,316C 396.054,314.252 397.72,314.085 399.5,315.5C 403.473,314.616 407.473,313.949 411.5,313.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#34a56d" d="M 539.5,314.5 C 531.639,318.101 523.972,322.268 516.5,327C 502.723,337.864 489.057,348.697 475.5,359.5C 472.139,361.511 468.806,363.511 465.5,365.5C 452.594,368.621 440.594,373.121 429.5,379C 422.776,380.729 416.109,382.562 409.5,384.5C 423.926,375.444 438.26,366.111 452.5,356.5C 454.701,355.434 457.035,354.767 459.5,354.5C 460.199,351.459 462.199,349.792 465.5,349.5C 487.162,340.446 507.995,329.78 528,317.5C 528.333,317.833 528.667,318.167 529,318.5C 532.341,316.746 535.841,315.413 539.5,314.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#20925c" d="M 462.5,316.5 C 458.868,317.984 455.534,319.984 452.5,322.5C 446.006,325.11 439.339,327.11 432.5,328.5C 414.128,332.088 395.795,336.588 377.5,342C 374.099,343.691 370.599,345.191 367,346.5C 366.439,345.978 365.772,345.645 365,345.5C 357.463,349.513 349.63,352.846 341.5,355.5C 345.167,352.167 348.833,348.833 352.5,345.5C 355.004,344.416 357.337,343.083 359.5,341.5C 361.331,340.948 362.997,340.948 364.5,341.5C 385.293,334.924 406.626,329.758 428.5,326C 429.253,324.513 430.086,324.346 431,325.5C 441.606,322.683 452.106,319.683 462.5,316.5 Z"/></g>
|
||||
<g><path style="opacity:0.998" fill="#188855" d="M 326.5,317.5 C 327.833,317.5 329.167,317.5 330.5,317.5C 331.552,317.351 332.552,317.517 333.5,318C 329.256,321.423 325.256,324.923 321.5,328.5C 317.112,333.845 312.112,338.512 306.5,342.5C 305.05,344.61 303.05,345.943 300.5,346.5C 296.217,346.087 292.217,347.254 288.5,350C 282.584,351.751 276.584,353.084 270.5,354C 268.919,354.707 267.419,355.54 266,356.5C 262.7,356.65 259.367,356.65 256,356.5C 251.22,357.659 246.386,358.659 241.5,359.5C 241.354,355.481 241.021,351.481 240.5,347.5C 243.328,345.252 246.328,343.252 249.5,341.5C 260.675,337.735 271.675,333.735 282.5,329.5C 287.531,329.036 292.198,327.703 296.5,325.5C 306.685,323.122 316.685,320.455 326.5,317.5 Z"/></g>
|
||||
<g><path style="opacity:0.992" fill="#3cb073" d="M 570.5,324.5 C 570.008,329.959 569.008,335.292 567.5,340.5C 561.286,340.772 555.119,340.438 549,339.5C 546.088,341.066 542.921,341.899 539.5,342C 522.201,351.819 504.201,360.986 485.5,369.5C 485.511,367.983 486.177,366.816 487.5,366C 497.397,359.111 506.73,351.445 515.5,343C 521.545,339.65 527.211,335.817 532.5,331.5C 532.953,330.542 533.619,329.708 534.5,329C 546.326,324.924 558.326,323.424 570.5,324.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#23925f" d="M 432.5,328.5 C 423.32,334.743 413.32,339.577 402.5,343C 399.98,344.697 397.647,346.53 395.5,348.5C 393.167,349.167 390.833,349.833 388.5,350.5C 383.906,352.376 379.239,354.043 374.5,355.5C 373.833,355.167 373.167,354.833 372.5,354.5C 368.186,357.727 363.52,359.394 358.5,359.5C 352.993,362.684 347.16,365.35 341,367.5C 335.468,368.458 329.968,370.458 324.5,373.5C 323.914,373.291 323.414,372.957 323,372.5C 320.24,374.674 317.407,375.674 314.5,375.5C 322.452,369.552 330.118,363.219 337.5,356.5C 338.833,356.167 340.167,355.833 341.5,355.5C 349.63,352.846 357.463,349.513 365,345.5C 365.772,345.645 366.439,345.978 367,346.5C 370.599,345.191 374.099,343.691 377.5,342C 395.795,336.588 414.128,332.088 432.5,328.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#3bab73" d="M 532.5,331.5 C 527.211,335.817 521.545,339.65 515.5,343C 506.73,351.445 497.397,359.111 487.5,366C 486.177,366.816 485.511,367.983 485.5,369.5C 485.158,370.338 484.492,370.672 483.5,370.5C 482.828,369.733 481.995,369.066 481,368.5C 465.373,377.543 448.873,384.543 431.5,389.5C 442.797,380.777 454.13,372.777 465.5,365.5C 468.806,363.511 472.139,361.511 475.5,359.5C 476.397,358.402 477.23,358.402 478,359.5C 483.236,356.869 488.236,353.869 493,350.5C 493.333,350.833 493.667,351.167 494,351.5C 506.065,342.722 518.899,336.055 532.5,331.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#2a9964" d="M 461.5,335.5 C 457.341,338.749 452.674,341.249 447.5,343C 445.937,343.759 444.937,344.926 444.5,346.5C 440.038,348.73 435.372,350.397 430.5,351.5C 418.445,354.378 406.445,358.378 394.5,363.5C 393.914,363.291 393.414,362.957 393,362.5C 378.78,367.693 364.614,373.027 350.5,378.5C 353.951,373.709 358.285,370.042 363.5,367.5C 365.05,366.559 366.716,365.893 368.5,365.5C 376.438,363.235 384.438,360.235 392.5,356.5C 393.086,356.709 393.586,357.043 394,357.5C 399.227,354.644 404.727,352.311 410.5,350.5C 411.167,350.833 411.833,351.167 412.5,351.5C 428.519,346.193 444.852,340.859 461.5,335.5 Z"/></g>
|
||||
<g><path style="opacity:0.999" fill="#42b278" d="M 567.5,340.5 C 567.5,341.167 567.5,341.833 567.5,342.5C 560.492,342.334 553.492,342.5 546.5,343C 545.234,343.309 544.067,343.809 543,344.5C 542.667,344.167 542.333,343.833 542,343.5C 537.452,349.519 531.619,353.685 524.5,356C 519.822,361.856 514.155,366.356 507.5,369.5C 495.691,376.155 483.524,382.155 471,387.5C 470.667,387.167 470.333,386.833 470,386.5C 463.951,388.776 458.117,391.443 452.5,394.5C 456.961,388.588 462.628,384.088 469.5,381C 472.938,377.975 476.271,374.808 479.5,371.5C 480.736,370.754 482.07,370.421 483.5,370.5C 484.492,370.672 485.158,370.338 485.5,369.5C 504.201,360.986 522.201,351.819 539.5,342C 542.921,341.899 546.088,341.066 549,339.5C 555.119,340.438 561.286,340.772 567.5,340.5 Z"/></g>
|
||||
<g><path style="opacity:0.988" fill="#1c8858" d="M 300.5,346.5 C 292.791,351.359 285.458,356.859 278.5,363C 270.538,365.983 262.871,369.483 255.5,373.5C 251.146,374.086 246.812,374.752 242.5,375.5C 241.806,370.195 241.472,364.862 241.5,359.5C 246.386,358.659 251.22,357.659 256,356.5C 259.367,356.65 262.7,356.65 266,356.5C 267.419,355.54 268.919,354.707 270.5,354C 276.584,353.084 282.584,351.751 288.5,350C 292.217,347.254 296.217,346.087 300.5,346.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#208c5c" d="M 352.5,345.5 C 348.833,348.833 345.167,352.167 341.5,355.5C 340.167,355.833 338.833,356.167 337.5,356.5C 333.577,357.795 329.91,359.628 326.5,362C 319.403,363.321 312.736,365.821 306.5,369.5C 304.316,368.892 302.316,369.559 300.5,371.5C 287.117,376.169 273.284,379.835 259,382.5C 253.657,382.296 248.157,382.296 242.5,382.5C 242.5,380.167 242.5,377.833 242.5,375.5C 246.812,374.752 251.146,374.086 255.5,373.5C 255.735,374.097 256.235,374.43 257,374.5C 266.754,371.914 276.587,369.747 286.5,368C 291.271,366.351 295.938,364.518 300.5,362.5C 301.086,362.709 301.586,363.043 302,363.5C 306.905,360.103 312.072,358.103 317.5,357.5C 329.092,352.194 340.759,348.194 352.5,345.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#279262" d="M 388.5,350.5 C 384.498,353.835 380.165,356.668 375.5,359C 373.271,361.4 370.937,363.567 368.5,365.5C 366.716,365.893 365.05,366.559 363.5,367.5C 355.646,368.841 348.479,371.841 342,376.5C 341.667,376.167 341.333,375.833 341,375.5C 330,380.5 319,385.5 308,390.5C 307.667,390.167 307.333,389.833 307,389.5C 299.077,393.196 290.911,396.196 282.5,398.5C 292.09,392.569 301.09,385.902 309.5,378.5C 310.922,377.075 312.589,376.075 314.5,375.5C 317.407,375.674 320.24,374.674 323,372.5C 323.414,372.957 323.914,373.291 324.5,373.5C 329.968,370.458 335.468,368.458 341,367.5C 347.16,365.35 352.993,362.684 358.5,359.5C 363.52,359.394 368.186,357.727 372.5,354.5C 373.167,354.833 373.833,355.167 374.5,355.5C 379.239,354.043 383.906,352.376 388.5,350.5 Z"/></g>
|
||||
<g><path style="opacity:0.994" fill="#45b77a" d="M 567.5,342.5 C 566.172,347.812 564.839,353.146 563.5,358.5C 558.156,358.334 552.823,358.501 547.5,359C 544.308,359.197 541.308,360.03 538.5,361.5C 537.914,361.291 537.414,360.957 537,360.5C 524.662,366.42 512.495,372.42 500.5,378.5C 503.239,375.767 505.573,372.767 507.5,369.5C 514.155,366.356 519.822,361.856 524.5,356C 531.619,353.685 537.452,349.519 542,343.5C 542.333,343.833 542.667,344.167 543,344.5C 544.067,343.809 545.234,343.309 546.5,343C 553.492,342.5 560.492,342.334 567.5,342.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#2e9868" d="M 430.5,351.5 C 427.388,353.572 424.388,355.905 421.5,358.5C 411.875,362.311 403.208,367.644 395.5,374.5C 391.473,376.837 387.473,379.17 383.5,381.5C 381.54,382.138 379.707,382.138 378,381.5C 376.829,383.616 375.329,384.282 373.5,383.5C 363.669,388.131 353.669,392.464 343.5,396.5C 342.914,396.291 342.414,395.957 342,395.5C 336.134,398.122 330.467,401.122 325,404.5C 324.667,404.167 324.333,403.833 324,403.5C 320.044,406.728 315.544,408.728 310.5,409.5C 321.047,400.531 331.713,391.531 342.5,382.5C 345.074,380.976 347.741,379.642 350.5,378.5C 364.614,373.027 378.78,367.693 393,362.5C 393.414,362.957 393.914,363.291 394.5,363.5C 406.445,358.378 418.445,354.378 430.5,351.5 Z"/></g>
|
||||
<g><path style="opacity:0.997" fill="#238d5e" d="M 337.5,356.5 C 330.118,363.219 322.452,369.552 314.5,375.5C 312.589,376.075 310.922,377.075 309.5,378.5C 302.88,380.219 296.213,382.719 289.5,386C 279.075,387.317 268.908,389.484 259,392.5C 253.275,392.318 247.442,392.318 241.5,392.5C 242.207,389.214 242.54,385.881 242.5,382.5C 248.157,382.296 253.657,382.296 259,382.5C 273.284,379.835 287.117,376.169 300.5,371.5C 302.316,369.559 304.316,368.892 306.5,369.5C 312.736,365.821 319.403,363.321 326.5,362C 329.91,359.628 333.577,357.795 337.5,356.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#349f6d" d="M 452.5,356.5 C 438.26,366.111 423.926,375.444 409.5,384.5C 407.252,387.393 404.252,389.06 400.5,389.5C 395.259,390.746 389.926,392.746 384.5,395.5C 383.914,395.291 383.414,394.957 383,394.5C 377.651,396.51 372.651,399.177 368,402.5C 367.586,402.043 367.086,401.709 366.5,401.5C 359.606,405.615 352.273,408.615 344.5,410.5C 357.322,400.59 370.322,390.923 383.5,381.5C 387.473,379.17 391.473,376.837 395.5,374.5C 400.559,373.536 405.393,371.869 410,369.5C 410.333,369.833 410.667,370.167 411,370.5C 412.572,368.437 414.405,367.771 416.5,368.5C 417.912,367.194 419.579,366.36 421.5,366C 425.219,365.612 428.886,364.945 432.5,364C 438.971,360.886 445.638,358.386 452.5,356.5 Z"/></g>
|
||||
<g><path style="opacity:0.994" fill="#48b97d" d="M 563.5,358.5 C 563.167,360.5 562.833,362.5 562.5,364.5C 556.533,365.471 550.533,366.305 544.5,367C 540.771,368.255 537.438,370.088 534.5,372.5C 527.33,373.5 520.997,376.333 515.5,381C 511.991,381.422 508.657,382.422 505.5,384C 496.664,387.919 487.998,392.085 479.5,396.5C 479.859,394.629 480.859,393.129 482.5,392C 487.414,388.723 492.08,385.223 496.5,381.5C 497.833,380.5 499.167,379.5 500.5,378.5C 512.495,372.42 524.662,366.42 537,360.5C 537.414,360.957 537.914,361.291 538.5,361.5C 541.308,360.03 544.308,359.197 547.5,359C 552.823,358.501 558.156,358.334 563.5,358.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#3ba573" d="M 465.5,365.5 C 454.13,372.777 442.797,380.777 431.5,389.5C 429.606,390.048 427.94,391.048 426.5,392.5C 424.655,391.605 423.322,392.272 422.5,394.5C 409.404,397.361 397.07,401.861 385.5,408C 381.294,409.777 376.961,410.944 372.5,411.5C 381.56,403.659 390.893,396.326 400.5,389.5C 404.252,389.06 407.252,387.393 409.5,384.5C 416.109,382.562 422.776,380.729 429.5,379C 440.594,373.121 452.594,368.621 465.5,365.5 Z"/></g>
|
||||
<g><path style="opacity:0.934" fill="#2da166" d="M 607.5,340.5 C 607.5,361.5 607.5,382.5 607.5,403.5C 605.033,418.047 601.033,432.047 595.5,445.5C 595.5,431.167 595.5,416.833 595.5,402.5C 600.378,381.88 604.378,361.213 607.5,340.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#2a9264" d="M 363.5,367.5 C 358.285,370.042 353.951,373.709 350.5,378.5C 347.741,379.642 345.074,380.976 342.5,382.5C 341.883,382.389 341.383,382.056 341,381.5C 336.687,383.8 332.353,386.133 328,388.5C 327.667,388.167 327.333,387.833 327,387.5C 322.145,390.567 316.978,393.067 311.5,395C 301.957,397.194 292.79,400.36 284,404.5C 283.228,404.355 282.561,404.022 282,403.5C 275.698,405.162 269.365,406.829 263,408.5C 261.93,408.472 261.097,408.139 260.5,407.5C 267.62,403.939 274.954,400.939 282.5,398.5C 290.911,396.196 299.077,393.196 307,389.5C 307.333,389.833 307.667,390.167 308,390.5C 319,385.5 330,380.5 341,375.5C 341.333,375.833 341.667,376.167 342,376.5C 348.479,371.841 355.646,368.841 363.5,367.5 Z"/></g>
|
||||
<g><path style="opacity:0.987" fill="#4dbd82" d="M 562.5,364.5 C 559.833,373.833 557.167,383.167 554.5,392.5C 549.489,392.334 544.489,392.501 539.5,393C 533.633,394.887 527.633,396.22 521.5,397C 513.644,401.215 505.311,404.048 496.5,405.5C 497.347,404.034 498.68,403.2 500.5,403C 502.141,401.871 503.141,400.371 503.5,398.5C 504.117,398.611 504.617,398.944 505,399.5C 514.35,389.919 524.184,380.919 534.5,372.5C 537.438,370.088 540.771,368.255 544.5,367C 550.533,366.305 556.533,365.471 562.5,364.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#45b27b" d="M 507.5,369.5 C 505.573,372.767 503.239,375.767 500.5,378.5C 499.167,379.5 497.833,380.5 496.5,381.5C 477,388.777 457.667,396.444 438.5,404.5C 441.209,401.825 443.876,399.158 446.5,396.5C 448.582,395.074 450.582,394.408 452.5,394.5C 458.117,391.443 463.951,388.776 470,386.5C 470.333,386.833 470.667,387.167 471,387.5C 483.524,382.155 495.691,376.155 507.5,369.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#4cb881" d="M 534.5,372.5 C 524.184,380.919 514.35,389.919 505,399.5C 504.617,398.944 504.117,398.611 503.5,398.5C 491.624,403.401 479.29,407.901 466.5,412C 462.793,412.737 459.127,413.571 455.5,414.5C 458.683,410.736 462.35,408.236 466.5,407C 469.574,404.151 472.574,401.317 475.5,398.5C 476.601,396.606 477.934,395.939 479.5,396.5C 487.998,392.085 496.664,387.919 505.5,384C 508.657,382.422 511.991,381.422 515.5,381C 520.997,376.333 527.33,373.5 534.5,372.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#41ab78" d="M 483.5,370.5 C 482.07,370.421 480.736,370.754 479.5,371.5C 476.271,374.808 472.938,377.975 469.5,381C 462.628,384.088 456.961,388.588 452.5,394.5C 450.582,394.408 448.582,395.074 446.5,396.5C 429.661,402.212 413.328,408.212 397.5,414.5C 403.744,407.678 410.744,402.511 418.5,399C 420.041,397.629 421.375,396.129 422.5,394.5C 423.322,392.272 424.655,391.605 426.5,392.5C 427.94,391.048 429.606,390.048 431.5,389.5C 448.873,384.543 465.373,377.543 481,368.5C 481.995,369.066 482.828,369.733 483.5,370.5 Z"/></g>
|
||||
<g><path style="opacity:0.991" fill="#278e62" d="M 309.5,378.5 C 301.09,385.902 292.09,392.569 282.5,398.5C 274.954,400.939 267.62,403.939 260.5,407.5C 253.837,407.981 247.171,408.315 240.5,408.5C 241.4,403.228 241.733,397.895 241.5,392.5C 247.442,392.318 253.275,392.318 259,392.5C 268.908,389.484 279.075,387.317 289.5,386C 296.213,382.719 302.88,380.219 309.5,378.5 Z"/></g>
|
||||
<g><path style="opacity:0.995" fill="#2e9267" d="M 342.5,382.5 C 331.713,391.531 321.047,400.531 310.5,409.5C 309.883,409.389 309.383,409.056 309,408.5C 307.223,410.79 305.056,412.457 302.5,413.5C 292.144,417.047 281.644,420.047 271,422.5C 265.275,421.059 259.608,421.393 254,423.5C 249.248,422.236 244.414,421.569 239.5,421.5C 240.08,417.19 240.414,412.857 240.5,408.5C 247.171,408.315 253.837,407.981 260.5,407.5C 261.097,408.139 261.93,408.472 263,408.5C 269.365,406.829 275.698,405.162 282,403.5C 282.561,404.022 283.228,404.355 284,404.5C 292.79,400.36 301.957,397.194 311.5,395C 316.978,393.067 322.145,390.567 327,387.5C 327.333,387.833 327.667,388.167 328,388.5C 332.353,386.133 336.687,383.8 341,381.5C 341.383,382.056 341.883,382.389 342.5,382.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#35986d" d="M 383.5,381.5 C 370.322,390.923 357.322,400.59 344.5,410.5C 342.772,412.226 340.772,413.559 338.5,414.5C 330.953,417.384 323.62,420.717 316.5,424.5C 315.914,424.291 315.414,423.957 315,423.5C 312.283,424.629 309.783,426.129 307.5,428C 298.296,429.846 289.463,432.68 281,436.5C 280.439,435.978 279.772,435.645 279,435.5C 276.57,437.606 273.903,437.939 271,436.5C 267.45,437.804 263.783,438.471 260,438.5C 252.583,436.993 245.083,436.327 237.5,436.5C 237.5,435.5 237.5,434.5 237.5,433.5C 249.183,434.988 260.849,434.488 272.5,432C 280.059,428.772 287.392,425.106 294.5,421C 297.062,418.267 299.729,415.767 302.5,413.5C 305.056,412.457 307.223,410.79 309,408.5C 309.383,409.056 309.883,409.389 310.5,409.5C 315.544,408.728 320.044,406.728 324,403.5C 324.333,403.833 324.667,404.167 325,404.5C 330.467,401.122 336.134,398.122 342,395.5C 342.414,395.957 342.914,396.291 343.5,396.5C 353.669,392.464 363.669,388.131 373.5,383.5C 375.329,384.282 376.829,383.616 378,381.5C 379.707,382.138 381.54,382.138 383.5,381.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#48b27e" d="M 496.5,381.5 C 492.08,385.223 487.414,388.723 482.5,392C 480.859,393.129 479.859,394.629 479.5,396.5C 477.934,395.939 476.601,396.606 475.5,398.5C 469.904,399.42 464.737,401.42 460,404.5C 459.586,404.043 459.086,403.709 458.5,403.5C 450.45,407.742 442.117,411.408 433.5,414.5C 432.833,414.167 432.167,413.833 431.5,413.5C 427.46,415.243 423.46,416.909 419.5,418.5C 423.553,414.776 427.553,411.109 431.5,407.5C 434.038,406.957 436.372,405.957 438.5,404.5C 457.667,396.444 477,388.777 496.5,381.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#3b9f72" d="M 400.5,389.5 C 390.893,396.326 381.56,403.659 372.5,411.5C 370.777,413.218 368.777,414.551 366.5,415.5C 363.95,416.358 361.45,417.358 359,418.5C 358.667,418.167 358.333,417.833 358,417.5C 347.863,423.159 337.697,427.992 327.5,432C 321.441,433.743 315.441,435.576 309.5,437.5C 309.937,435.926 310.937,434.759 312.5,434C 322.288,428.675 330.954,422.175 338.5,414.5C 340.772,413.559 342.772,412.226 344.5,410.5C 352.273,408.615 359.606,405.615 366.5,401.5C 367.086,401.709 367.586,402.043 368,402.5C 372.651,399.177 377.651,396.51 383,394.5C 383.414,394.957 383.914,395.291 384.5,395.5C 389.926,392.746 395.259,390.746 400.5,389.5 Z"/></g>
|
||||
<g><path style="opacity:0.994" fill="#54bf87" d="M 554.5,392.5 C 551.893,401.321 548.893,409.988 545.5,418.5C 540.425,416.199 535.092,415.532 529.5,416.5C 528.167,415.833 526.833,415.167 525.5,414.5C 516.999,414.733 508.666,416.4 500.5,419.5C 499.914,419.291 499.414,418.957 499,418.5C 495.294,420.739 491.294,422.406 487,423.5C 486.228,423.355 485.561,423.022 485,422.5C 480.686,424.66 476.186,426.327 471.5,427.5C 479.182,420.038 486.515,413.038 493.5,406.5C 494.609,406.443 495.609,406.11 496.5,405.5C 505.311,404.048 513.644,401.215 521.5,397C 527.633,396.22 533.633,394.887 539.5,393C 544.489,392.501 549.489,392.334 554.5,392.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#45ab7b" d="M 446.5,396.5 C 443.876,399.158 441.209,401.825 438.5,404.5C 436.372,405.957 434.038,406.957 431.5,407.5C 425.803,409.171 420.136,411.171 414.5,413.5C 413.914,413.291 413.414,412.957 413,412.5C 402.555,417.15 392.055,421.483 381.5,425.5C 384.833,422.5 388.167,419.5 391.5,416.5C 393.229,415.883 394.729,414.883 396,413.5C 396.383,414.056 396.883,414.389 397.5,414.5C 413.328,408.212 429.661,402.212 446.5,396.5 Z"/></g>
|
||||
<g><path style="opacity:0.981" fill="#59bb69" d="M 191.5,384.5 C 181.581,397.33 172.914,410.996 165.5,425.5C 140.5,449.833 115.833,474.5 91.5,499.5C 89.0002,496.506 87.0002,493.173 85.5,489.5C 120.833,454.5 156.167,419.5 191.5,384.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#41a578" d="M 422.5,394.5 C 421.375,396.129 420.041,397.629 418.5,399C 410.744,402.511 403.744,407.678 397.5,414.5C 396.883,414.389 396.383,414.056 396,413.5C 394.729,414.883 393.229,415.883 391.5,416.5C 372.564,424.163 353.898,432.163 335.5,440.5C 336.476,439.185 337.476,437.852 338.5,436.5C 347.825,429.503 357.158,422.503 366.5,415.5C 368.777,414.551 370.777,413.218 372.5,411.5C 376.961,410.944 381.294,409.777 385.5,408C 397.07,401.861 409.404,397.361 422.5,394.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#4cb281" d="M 475.5,398.5 C 472.574,401.317 469.574,404.151 466.5,407C 462.35,408.236 458.683,410.736 455.5,414.5C 453.816,415.527 452.149,416.527 450.5,417.5C 430.948,423.484 411.948,430.151 393.5,437.5C 399.833,432.167 406.167,426.833 412.5,421.5C 414.945,420.688 417.278,419.688 419.5,418.5C 423.46,416.909 427.46,415.243 431.5,413.5C 432.167,413.833 432.833,414.167 433.5,414.5C 442.117,411.408 450.45,407.742 458.5,403.5C 459.086,403.709 459.586,404.043 460,404.5C 464.737,401.42 469.904,399.42 475.5,398.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#50b884" d="M 503.5,398.5 C 503.141,400.371 502.141,401.871 500.5,403C 498.68,403.2 497.347,404.034 496.5,405.5C 495.609,406.11 494.609,406.443 493.5,406.5C 490.351,408.152 487.184,409.819 484,411.5C 476.196,412.323 468.696,414.823 461.5,419C 455.283,421.304 448.949,423.137 442.5,424.5C 445.167,422.167 447.833,419.833 450.5,417.5C 452.149,416.527 453.816,415.527 455.5,414.5C 459.127,413.571 462.793,412.737 466.5,412C 479.29,407.901 491.624,403.401 503.5,398.5 Z"/></g>
|
||||
<g><path style="opacity:0.933" fill="#35a56d" d="M 595.5,402.5 C 595.5,416.833 595.5,431.167 595.5,445.5C 593.237,454.016 589.904,462.016 585.5,469.5C 585.5,457.833 585.5,446.167 585.5,434.5C 588.665,423.678 591.998,413.011 595.5,402.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#54b887" d="M 493.5,406.5 C 486.515,413.038 479.182,420.038 471.5,427.5C 470.603,428.598 469.77,428.598 469,427.5C 467.955,428.373 467.122,429.373 466.5,430.5C 465.391,430.557 464.391,430.89 463.5,431.5C 456.743,433.919 449.91,436.253 443,438.5C 442.228,438.355 441.561,438.022 441,437.5C 434.972,441.079 428.639,443.079 422,443.5C 418.995,445.002 415.829,446.002 412.5,446.5C 421.096,440.579 429.429,434.245 437.5,427.5C 438.397,426.402 439.23,426.402 440,427.5C 441.045,426.627 441.878,425.627 442.5,424.5C 448.949,423.137 455.283,421.304 461.5,419C 468.696,414.823 476.196,412.323 484,411.5C 487.184,409.819 490.351,408.152 493.5,406.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#48ab7e" d="M 431.5,407.5 C 427.553,411.109 423.553,414.776 419.5,418.5C 417.278,419.688 414.945,420.688 412.5,421.5C 399.602,425.95 386.935,430.95 374.5,436.5C 373.914,436.291 373.414,435.957 373,435.5C 369.044,437.418 365.21,439.418 361.5,441.5C 362.81,439.852 364.143,438.186 365.5,436.5C 369.766,434.546 373.433,431.879 376.5,428.5C 378.184,427.473 379.851,426.473 381.5,425.5C 392.055,421.483 402.555,417.15 413,412.5C 413.414,412.957 413.914,413.291 414.5,413.5C 420.136,411.171 425.803,409.171 431.5,407.5 Z"/></g>
|
||||
<g><path style="opacity:0.991" fill="#33946c" d="M 302.5,413.5 C 299.729,415.767 297.062,418.267 294.5,421C 287.392,425.106 280.059,428.772 272.5,432C 260.849,434.488 249.183,434.988 237.5,433.5C 238.167,429.5 238.833,425.5 239.5,421.5C 244.414,421.569 249.248,422.236 254,423.5C 259.608,421.393 265.275,421.059 271,422.5C 281.644,420.047 292.144,417.047 302.5,413.5 Z"/></g>
|
||||
<g><path style="opacity:0.995" fill="#3b9972" d="M 338.5,414.5 C 330.954,422.175 322.288,428.675 312.5,434C 310.937,434.759 309.937,435.926 309.5,437.5C 306.347,439.55 303.014,441.216 299.5,442.5C 278.238,450.317 256.572,451.983 234.5,447.5C 235.385,443.712 236.385,440.046 237.5,436.5C 245.083,436.327 252.583,436.993 260,438.5C 263.783,438.471 267.45,437.804 271,436.5C 273.903,437.939 276.57,437.606 279,435.5C 279.772,435.645 280.439,435.978 281,436.5C 289.463,432.68 298.296,429.846 307.5,428C 309.783,426.129 312.283,424.629 315,423.5C 315.414,423.957 315.914,424.291 316.5,424.5C 323.62,420.717 330.953,417.384 338.5,414.5 Z"/></g>
|
||||
<g><path style="opacity:0.983" fill="#5ac28c" d="M 545.5,418.5 C 542.716,426.734 539.383,434.734 535.5,442.5C 529.342,440.042 523.008,439.375 516.5,440.5C 512.088,439.385 507.588,438.718 503,438.5C 499.568,438.33 496.401,438.996 493.5,440.5C 496.709,435.802 500.876,432.135 506,429.5C 506.333,429.833 506.667,430.167 507,430.5C 511.861,424.985 517.695,420.818 524.5,418C 511.368,417.907 498.868,420.741 487,426.5C 481.724,426.612 476.558,427.945 471.5,430.5C 469.872,429.465 468.205,429.465 466.5,430.5C 467.122,429.373 467.955,428.373 469,427.5C 469.77,428.598 470.603,428.598 471.5,427.5C 476.186,426.327 480.686,424.66 485,422.5C 485.561,423.022 486.228,423.355 487,423.5C 491.294,422.406 495.294,420.739 499,418.5C 499.414,418.957 499.914,419.291 500.5,419.5C 508.666,416.4 516.999,414.733 525.5,414.5C 526.833,415.167 528.167,415.833 529.5,416.5C 535.092,415.532 540.425,416.199 545.5,418.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#45a57b" d="M 391.5,416.5 C 388.167,419.5 384.833,422.5 381.5,425.5C 379.851,426.473 378.184,427.473 376.5,428.5C 363.718,433.041 351.051,438.541 338.5,445C 331.689,447.199 325.022,449.699 318.5,452.5C 321.545,449.453 324.878,446.787 328.5,444.5C 330.969,443.431 333.302,442.098 335.5,440.5C 353.898,432.163 372.564,424.163 391.5,416.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#50b284" d="M 450.5,417.5 C 447.833,419.833 445.167,422.167 442.5,424.5C 441.878,425.627 441.045,426.627 440,427.5C 439.23,426.402 438.397,426.402 437.5,427.5C 430.891,429.423 424.224,431.257 417.5,433C 412.361,436.491 406.861,438.325 401,438.5C 394.449,440.941 388.116,443.941 382,447.5C 381.617,446.944 381.117,446.611 380.5,446.5C 382.806,444.861 384.806,442.861 386.5,440.5C 388.716,439.797 390.549,438.464 392,436.5C 392.383,437.056 392.883,437.389 393.5,437.5C 411.948,430.151 430.948,423.484 450.5,417.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#5abe8c" d="M 493.5,440.5 C 491.265,440.205 489.265,440.539 487.5,441.5C 470.28,445.677 452.946,449.344 435.5,452.5C 444.882,445.436 454.215,438.436 463.5,431.5C 464.391,430.89 465.391,430.557 466.5,430.5C 468.205,429.465 469.872,429.465 471.5,430.5C 476.558,427.945 481.724,426.612 487,426.5C 498.868,420.741 511.368,417.907 524.5,418C 517.695,420.818 511.861,424.985 507,430.5C 506.667,430.167 506.333,429.833 506,429.5C 500.876,432.135 496.709,435.802 493.5,440.5 Z"/></g>
|
||||
<g><path style="opacity:0.999" fill="#419f78" d="M 366.5,415.5 C 357.158,422.503 347.825,429.503 338.5,436.5C 337.476,437.852 336.476,439.185 335.5,440.5C 333.302,442.098 330.969,443.431 328.5,444.5C 327.85,444.196 327.183,443.863 326.5,443.5C 316.752,448.397 307.085,452.564 297.5,456C 289.962,456.774 282.628,458.441 275.5,461C 265.35,461.724 255.183,462.224 245,462.5C 240.647,460.786 236.147,459.786 231.5,459.5C 231.5,458.833 231.833,458.5 232.5,458.5C 237.414,458.569 242.248,459.236 247,460.5C 251.169,458.317 255.502,457.984 260,459.5C 265.417,456.904 270.917,455.404 276.5,455C 281.778,451.865 287.445,449.532 293.5,448C 295.696,446.301 297.696,444.467 299.5,442.5C 303.014,441.216 306.347,439.55 309.5,437.5C 315.441,435.576 321.441,433.743 327.5,432C 337.697,427.992 347.863,423.159 358,417.5C 358.333,417.833 358.667,418.167 359,418.5C 361.45,417.358 363.95,416.358 366.5,415.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#4dab81" d="M 412.5,421.5 C 406.167,426.833 399.833,432.167 393.5,437.5C 392.883,437.389 392.383,437.056 392,436.5C 390.549,438.464 388.716,439.797 386.5,440.5C 368.414,447.861 350.414,455.528 332.5,463.5C 340.204,456.138 348.537,449.471 357.5,443.5C 358.605,442.4 359.938,441.733 361.5,441.5C 365.21,439.418 369.044,437.418 373,435.5C 373.414,435.957 373.914,436.291 374.5,436.5C 386.935,430.95 399.602,425.95 412.5,421.5 Z"/></g>
|
||||
<g><path style="opacity:0.982" fill="#55ba65" d="M 165.5,425.5 C 160.753,436.752 156.419,448.086 152.5,459.5C 134.5,476.833 116.833,494.5 99.5,512.5C 96.5857,508.342 93.9191,504.009 91.5,499.5C 115.833,474.5 140.5,449.833 165.5,425.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#54b287" d="M 437.5,427.5 C 429.429,434.245 421.096,440.579 412.5,446.5C 411.167,447.167 409.833,447.833 408.5,448.5C 391.786,455.339 375.119,461.672 358.5,467.5C 349.649,470.404 349.315,469.57 357.5,465C 360.179,460.823 363.845,457.823 368.5,456C 370.706,453.963 372.706,451.797 374.5,449.5C 376.5,448.5 378.5,447.5 380.5,446.5C 381.117,446.611 381.617,446.944 382,447.5C 388.116,443.941 394.449,440.941 401,438.5C 406.861,438.325 412.361,436.491 417.5,433C 424.224,431.257 430.891,429.423 437.5,427.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#48a57d" d="M 376.5,428.5 C 373.433,431.879 369.766,434.546 365.5,436.5C 364.143,438.186 362.81,439.852 361.5,441.5C 359.938,441.733 358.605,442.4 357.5,443.5C 355.956,443.703 354.622,444.37 353.5,445.5C 352.914,445.291 352.414,444.957 352,444.5C 339.211,451.676 326.211,457.676 313,462.5C 312.667,462.167 312.333,461.833 312,461.5C 306.99,463.839 301.99,466.172 297,468.5C 296.329,467.748 295.496,467.414 294.5,467.5C 299.824,463.837 305.157,460.17 310.5,456.5C 311.117,456.611 311.617,456.944 312,457.5C 313.758,455.235 315.925,453.568 318.5,452.5C 325.022,449.699 331.689,447.199 338.5,445C 351.051,438.541 363.718,433.041 376.5,428.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#5ab88c" d="M 463.5,431.5 C 454.215,438.436 444.882,445.436 435.5,452.5C 433.216,452.975 431.216,453.975 429.5,455.5C 421.137,457.731 412.803,460.397 404.5,463.5C 403.914,463.291 403.414,462.957 403,462.5C 396.498,464.531 390.331,467.197 384.5,470.5C 383.893,470.376 383.56,470.043 383.5,469.5C 383.414,468.504 383.748,467.671 384.5,467C 391.891,461.277 399.557,455.944 407.5,451C 408.252,450.329 408.586,449.496 408.5,448.5C 409.833,447.833 411.167,447.167 412.5,446.5C 415.829,446.002 418.995,445.002 422,443.5C 428.639,443.079 434.972,441.079 441,437.5C 441.561,438.022 442.228,438.355 443,438.5C 449.91,436.253 456.743,433.919 463.5,431.5 Z"/></g>
|
||||
<g><path style="opacity:0.989" fill="#60c391" d="M 535.5,442.5 C 531.833,449.833 528.167,457.167 524.5,464.5C 518.084,461.125 511.417,459.459 504.5,459.5C 498.594,459.009 492.761,458.343 487,457.5C 485.135,459.673 482.969,460.007 480.5,458.5C 473.84,459.499 467.174,460.499 460.5,461.5C 470.111,455.02 479.777,448.52 489.5,442C 488.906,441.536 488.239,441.369 487.5,441.5C 489.265,440.539 491.265,440.205 493.5,440.5C 496.401,438.996 499.568,438.33 503,438.5C 507.588,438.718 512.088,439.385 516.5,440.5C 523.008,439.375 529.342,440.042 535.5,442.5 Z"/></g>
|
||||
<g><path style="opacity:0.925" fill="#3ba973" d="M 585.5,434.5 C 585.5,446.167 585.5,457.833 585.5,469.5C 583.874,475.419 581.207,480.753 577.5,485.5C 577.5,475.5 577.5,465.5 577.5,455.5C 579.792,448.28 582.459,441.28 585.5,434.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#50ab84" d="M 386.5,440.5 C 384.806,442.861 382.806,444.861 380.5,446.5C 378.5,447.5 376.5,448.5 374.5,449.5C 355.968,457.271 337.635,465.271 319.5,473.5C 321.146,471.188 323.146,469.188 325.5,467.5C 327.969,466.431 330.302,465.098 332.5,463.5C 350.414,455.528 368.414,447.861 386.5,440.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#60be91" d="M 487.5,441.5 C 488.239,441.369 488.906,441.536 489.5,442C 479.777,448.52 470.111,455.02 460.5,461.5C 460.167,461.5 459.833,461.5 459.5,461.5C 442.023,465.15 424.356,469.15 406.5,473.5C 414.348,467.741 422.015,461.741 429.5,455.5C 431.216,453.975 433.216,452.975 435.5,452.5C 452.946,449.344 470.28,445.677 487.5,441.5 Z"/></g>
|
||||
<g><path style="opacity:0.996" fill="#459f7b" d="M 328.5,444.5 C 324.878,446.787 321.545,449.453 318.5,452.5C 315.925,453.568 313.758,455.235 312,457.5C 311.617,456.944 311.117,456.611 310.5,456.5C 305.126,457.235 300.293,459.235 296,462.5C 295.586,462.043 295.086,461.709 294.5,461.5C 289.296,463.017 284.129,464.684 279,466.5C 278.127,466.265 277.293,465.931 276.5,465.5C 273.032,466.6 269.532,467.6 266,468.5C 259.966,468.247 253.966,468.247 248,468.5C 242.121,467.294 236.288,466.294 230.5,465.5C 230.833,463.5 231.167,461.5 231.5,459.5C 236.147,459.786 240.647,460.786 245,462.5C 255.183,462.224 265.35,461.724 275.5,461C 282.628,458.441 289.962,456.774 297.5,456C 307.085,452.564 316.752,448.397 326.5,443.5C 327.183,443.863 327.85,444.196 328.5,444.5 Z"/></g>
|
||||
<g><path style="opacity:0.998" fill="#4da581" d="M 357.5,443.5 C 348.537,449.471 340.204,456.138 332.5,463.5C 330.302,465.098 327.969,466.431 325.5,467.5C 305.988,475.192 285.655,481.358 264.5,486C 254.171,486.034 243.838,485.701 233.5,485C 230.555,483.869 227.555,483.036 224.5,482.5C 224.557,481.391 224.89,480.391 225.5,479.5C 230.913,480.459 236.413,481.126 242,481.5C 246.829,480.452 251.662,480.286 256.5,481C 269.451,478.059 282.117,473.559 294.5,467.5C 295.496,467.414 296.329,467.748 297,468.5C 301.99,466.172 306.99,463.839 312,461.5C 312.333,461.833 312.667,462.167 313,462.5C 326.211,457.676 339.211,451.676 352,444.5C 352.414,444.957 352.914,445.291 353.5,445.5C 354.622,444.37 355.956,443.703 357.5,443.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#5ab18d" d="M 408.5,448.5 C 408.586,449.496 408.252,450.329 407.5,451C 399.557,455.944 391.891,461.277 384.5,467C 383.748,467.671 383.414,468.504 383.5,469.5C 381.142,470.874 378.808,472.207 376.5,473.5C 352.073,483.879 327.739,494.545 303.5,505.5C 314.961,496.265 326.628,487.265 338.5,478.5C 344.928,474.289 351.594,470.622 358.5,467.5C 375.119,461.672 391.786,455.339 408.5,448.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#54ab87" d="M 374.5,449.5 C 372.706,451.797 370.706,453.963 368.5,456C 363.845,457.823 360.179,460.823 357.5,465C 349.315,469.57 349.649,470.404 358.5,467.5C 351.594,470.622 344.928,474.289 338.5,478.5C 337.504,478.586 336.671,478.252 336,477.5C 315.096,489.569 292.262,497.235 267.5,500.5C 282.511,494.995 296.844,487.828 310.5,479C 312.295,475.289 315.295,473.455 319.5,473.5C 337.635,465.271 355.968,457.271 374.5,449.5 Z"/></g>
|
||||
<g><path style="opacity:0.989" fill="#409b76" d="M 299.5,442.5 C 297.696,444.467 295.696,446.301 293.5,448C 287.445,449.532 281.778,451.865 276.5,455C 270.917,455.404 265.417,456.904 260,459.5C 255.502,457.984 251.169,458.317 247,460.5C 242.248,459.236 237.414,458.569 232.5,458.5C 233.008,454.803 233.674,451.136 234.5,447.5C 256.572,451.983 278.238,450.317 299.5,442.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#61b892" d="M 429.5,455.5 C 422.015,461.741 414.348,467.741 406.5,473.5C 403.06,476.142 399.06,478.808 394.5,481.5C 388.633,482.77 382.966,484.603 377.5,487C 363.838,493.344 350.504,499.511 337.5,505.5C 338.167,504.5 338.833,503.5 339.5,502.5C 352.123,493.211 364.457,483.544 376.5,473.5C 378.808,472.207 381.142,470.874 383.5,469.5C 383.56,470.043 383.893,470.376 384.5,470.5C 390.331,467.197 396.498,464.531 403,462.5C 403.414,462.957 403.914,463.291 404.5,463.5C 412.803,460.397 421.137,457.731 429.5,455.5 Z"/></g>
|
||||
<g><path style="opacity:0.992" fill="#49a07e" d="M 310.5,456.5 C 305.157,460.17 299.824,463.837 294.5,467.5C 282.117,473.559 269.451,478.059 256.5,481C 251.662,480.286 246.829,480.452 242,481.5C 236.413,481.126 230.913,480.459 225.5,479.5C 227.179,474.748 228.846,470.082 230.5,465.5C 236.288,466.294 242.121,467.294 248,468.5C 253.966,468.247 259.966,468.247 266,468.5C 269.532,467.6 273.032,466.6 276.5,465.5C 277.293,465.931 278.127,466.265 279,466.5C 284.129,464.684 289.296,463.017 294.5,461.5C 295.086,461.709 295.586,462.043 296,462.5C 300.293,459.235 305.126,457.235 310.5,456.5 Z"/></g>
|
||||
<g><path style="opacity:0.991" fill="#64c494" d="M 524.5,464.5 C 523.248,466.001 522.248,467.668 521.5,469.5C 516.314,468.16 511.314,466.327 506.5,464C 499.491,463.624 492.491,463.124 485.5,462.5C 475.644,463.725 465.811,465.058 456,466.5C 455.235,466.43 454.735,466.097 454.5,465.5C 456.754,464.876 458.421,463.543 459.5,461.5C 459.833,461.5 460.167,461.5 460.5,461.5C 467.174,460.499 473.84,459.499 480.5,458.5C 482.969,460.007 485.135,459.673 487,457.5C 492.761,458.343 498.594,459.009 504.5,459.5C 511.417,459.459 518.084,461.125 524.5,464.5 Z"/></g>
|
||||
<g><path style="opacity:0.983" fill="#52ba62" d="M 152.5,459.5 C 151.739,464.437 150.405,469.103 148.5,473.5C 133.5,488.167 118.5,502.833 103.5,517.5C 101.937,516.055 100.604,514.389 99.5,512.5C 116.833,494.5 134.5,476.833 152.5,459.5 Z"/></g>
|
||||
<g><path style="opacity:0.922" fill="#41ac78" d="M 577.5,455.5 C 577.5,465.5 577.5,475.5 577.5,485.5C 575.003,491.165 572.003,496.498 568.5,501.5C 568.5,492.5 568.5,483.5 568.5,474.5C 571.263,467.976 574.263,461.643 577.5,455.5 Z"/></g>
|
||||
<g><path style="opacity:0.993" fill="#68c598" d="M 521.5,469.5 C 515.985,479.21 509.985,488.543 503.5,497.5C 495.276,494.222 486.942,491.222 478.5,488.5C 483.34,486.529 488.34,484.695 493.5,483C 488.515,480.908 483.349,480.408 478,481.5C 473,480.833 468,480.167 463,479.5C 460.727,481.184 458.06,481.518 455,480.5C 448.604,481.516 442.271,482.849 436,484.5C 432.546,483.727 429.046,483.727 425.5,484.5C 435.269,478.44 444.936,472.107 454.5,465.5C 454.735,466.097 455.235,466.43 456,466.5C 465.811,465.058 475.644,463.725 485.5,462.5C 492.491,463.124 499.491,463.624 506.5,464C 511.314,466.327 516.314,468.16 521.5,469.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#67be97" d="M 459.5,461.5 C 458.421,463.543 456.754,464.876 454.5,465.5C 444.936,472.107 435.269,478.44 425.5,484.5C 423.97,485.211 422.637,486.211 421.5,487.5C 412.999,487.67 404.999,489.67 397.5,493.5C 396.914,493.291 396.414,492.957 396,492.5C 385.962,496.312 376.462,500.312 367.5,504.5C 376.181,496.488 385.181,488.821 394.5,481.5C 399.06,478.808 403.06,476.142 406.5,473.5C 424.356,469.15 442.023,465.15 459.5,461.5 Z"/></g>
|
||||
<g><path style="opacity:0.975" fill="#4fb95f" d="M 148.5,473.5 C 146.862,483.03 144.862,492.363 142.5,501.5C 132.5,510.833 122.833,520.5 113.5,530.5C 109.408,526.742 106.074,522.409 103.5,517.5C 118.5,502.833 133.5,488.167 148.5,473.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#60b192" d="M 376.5,473.5 C 364.457,483.544 352.123,493.211 339.5,502.5C 328.639,508.511 317.639,514.344 306.5,520C 297.779,522.862 289.446,526.529 281.5,531C 274.003,532.406 267.17,535.239 261,539.5C 260.586,539.043 260.086,538.709 259.5,538.5C 254.21,540.207 249.043,542.207 244,544.5C 235.9,543.536 227.733,543.536 219.5,544.5C 223.544,542.758 227.711,541.091 232,539.5C 235.916,539.8 239.749,539.8 243.5,539.5C 246.341,537.914 249.007,536.08 251.5,534C 255.352,533.407 259.019,532.24 262.5,530.5C 272.634,523.67 282.967,517.336 293.5,511.5C 296.466,509.012 299.799,507.012 303.5,505.5C 327.739,494.545 352.073,483.879 376.5,473.5 Z"/></g>
|
||||
<g><path style="opacity:0.994" fill="#53a686" d="M 325.5,467.5 C 323.146,469.188 321.146,471.188 319.5,473.5C 315.295,473.455 312.295,475.289 310.5,479C 296.844,487.828 282.511,494.995 267.5,500.5C 265.906,500.92 264.406,501.586 263,502.5C 262.228,502.355 261.561,502.022 261,501.5C 256.111,502.653 251.111,503.32 246,503.5C 236.672,502.534 227.505,500.867 218.5,498.5C 220.305,493.084 222.305,487.751 224.5,482.5C 227.555,483.036 230.555,483.869 233.5,485C 243.838,485.701 254.171,486.034 264.5,486C 285.655,481.358 305.988,475.192 325.5,467.5 Z"/></g>
|
||||
<g><path style="opacity:0.994" fill="#5aaa8c" d="M 338.5,478.5 C 326.628,487.265 314.961,496.265 303.5,505.5C 299.799,507.012 296.466,509.012 293.5,511.5C 284.357,513.795 275.024,516.462 265.5,519.5C 264.311,519.244 263.144,518.911 262,518.5C 248.866,522.468 235.699,522.801 222.5,519.5C 221.558,519.608 220.725,519.941 220,520.5C 216.854,518.174 213.354,516.841 209.5,516.5C 211.992,510.182 214.992,504.182 218.5,498.5C 227.505,500.867 236.672,502.534 246,503.5C 251.111,503.32 256.111,502.653 261,501.5C 261.561,502.022 262.228,502.355 263,502.5C 264.406,501.586 265.906,500.92 267.5,500.5C 292.262,497.235 315.096,489.569 336,477.5C 336.671,478.252 337.504,478.586 338.5,478.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#6bc49b" d="M 478.5,488.5 C 477.391,488.557 476.391,488.89 475.5,489.5C 471.642,488.988 467.809,488.322 464,487.5C 455.846,488.183 447.68,488.683 439.5,489C 430.218,490.114 421.218,491.614 412.5,493.5C 415.802,492.635 418.802,490.635 421.5,487.5C 422.637,486.211 423.97,485.211 425.5,484.5C 429.046,483.727 432.546,483.727 436,484.5C 442.271,482.849 448.604,481.516 455,480.5C 458.06,481.518 460.727,481.184 463,479.5C 468,480.167 473,480.833 478,481.5C 483.349,480.408 488.515,480.908 493.5,483C 488.34,484.695 483.34,486.529 478.5,488.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#67b898" d="M 394.5,481.5 C 385.181,488.821 376.181,496.488 367.5,504.5C 365.5,505.833 363.5,507.167 361.5,508.5C 358.327,509.17 355.327,510.336 352.5,512C 347.503,515.488 342.503,518.155 337.5,520C 329.673,525.158 321.839,530.325 314,535.5C 313.667,535.167 313.333,534.833 313,534.5C 306.862,539.149 300.362,543.149 293.5,546.5C 299.22,540.656 304.886,534.823 310.5,529C 314.633,525.869 318.466,522.369 322,518.5C 322.333,518.833 322.667,519.167 323,519.5C 326.038,516.631 328.871,513.631 331.5,510.5C 333.5,508.833 335.5,507.167 337.5,505.5C 350.504,499.511 363.838,493.344 377.5,487C 382.966,484.603 388.633,482.77 394.5,481.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#6bbe9b" d="M 421.5,487.5 C 418.802,490.635 415.802,492.635 412.5,493.5C 411.167,494.167 409.833,494.833 408.5,495.5C 405.119,495.427 402.119,496.427 399.5,498.5C 398.833,498.167 398.167,497.833 397.5,497.5C 382.964,503.383 368.631,509.717 354.5,516.5C 356.146,513.19 358.48,510.523 361.5,508.5C 363.5,507.167 365.5,505.833 367.5,504.5C 376.462,500.312 385.962,496.312 396,492.5C 396.414,492.957 396.914,493.291 397.5,493.5C 404.999,489.67 412.999,487.67 421.5,487.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#6ec49d" d="M 475.5,489.5 C 469.337,492.114 463.337,495.114 457.5,498.5C 456.292,499.234 454.959,499.567 453.5,499.5C 451.696,498.838 449.696,498.505 447.5,498.5C 439.801,499.395 432.134,500.395 424.5,501.5C 423.393,500.978 422.226,500.645 421,500.5C 412.424,503.686 403.591,506.019 394.5,507.5C 399.201,504.178 403.868,500.178 408.5,495.5C 409.833,494.833 411.167,494.167 412.5,493.5C 421.218,491.614 430.218,490.114 439.5,489C 447.68,488.683 455.846,488.183 464,487.5C 467.809,488.322 471.642,488.988 475.5,489.5 Z"/></g>
|
||||
<g><path style="opacity:0.982" fill="#6ec89d" d="M 478.5,488.5 C 486.942,491.222 495.276,494.222 503.5,497.5C 501.238,502.09 498.238,506.09 494.5,509.5C 488.436,506.385 482.27,503.385 476,500.5C 475.439,501.022 474.772,501.355 474,501.5C 468.712,499.303 463.212,498.303 457.5,498.5C 463.337,495.114 469.337,492.114 475.5,489.5C 476.391,488.89 477.391,488.557 478.5,488.5 Z"/></g>
|
||||
<g><path style="opacity:0.925" fill="#4ab17f" d="M 568.5,474.5 C 568.5,483.5 568.5,492.5 568.5,501.5C 564.313,508.554 559.647,515.221 554.5,521.5C 554.5,514.5 554.5,507.5 554.5,500.5C 559.183,491.799 563.849,483.132 568.5,474.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#6ebe9d" d="M 408.5,495.5 C 403.868,500.178 399.201,504.178 394.5,507.5C 392.5,508.833 390.5,510.167 388.5,511.5C 385.834,511.933 383.168,512.433 380.5,513C 372.65,516.426 364.983,520.093 357.5,524C 347.05,530.201 337.05,537.035 327.5,544.5C 332.453,536.881 338.453,530.214 345.5,524.5C 348.384,521.581 351.384,518.915 354.5,516.5C 368.631,509.717 382.964,503.383 397.5,497.5C 398.167,497.833 398.833,498.167 399.5,498.5C 402.119,496.427 405.119,495.427 408.5,495.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#72c4a0" d="M 453.5,499.5 C 447.999,501.747 442.999,504.747 438.5,508.5C 436.716,508.893 435.05,509.559 433.5,510.5C 417.85,509.944 402.85,512.944 388.5,519.5C 387.914,519.291 387.414,518.957 387,518.5C 382.675,522.079 377.842,524.746 372.5,526.5C 377.204,520.795 382.537,515.795 388.5,511.5C 390.5,510.167 392.5,508.833 394.5,507.5C 403.591,506.019 412.424,503.686 421,500.5C 422.226,500.645 423.393,500.978 424.5,501.5C 432.134,500.395 439.801,499.395 447.5,498.5C 449.696,498.505 451.696,498.838 453.5,499.5 Z"/></g>
|
||||
<g><path style="opacity:0.987" fill="#72c9a1" d="M 457.5,498.5 C 463.212,498.303 468.712,499.303 474,501.5C 474.772,501.355 475.439,501.022 476,500.5C 482.27,503.385 488.436,506.385 494.5,509.5C 491.984,513.866 488.984,517.866 485.5,521.5C 478.806,517.634 471.806,514.467 464.5,512C 455.849,511.432 447.182,510.265 438.5,508.5C 442.999,504.747 447.999,501.747 453.5,499.5C 454.959,499.567 456.292,499.234 457.5,498.5 Z"/></g>
|
||||
<g><path style="opacity:0.969" fill="#4cb85c" d="M 142.5,501.5 C 142.051,506.863 141.384,512.196 140.5,517.5C 133.167,524.167 126.167,531.167 119.5,538.5C 117.122,536.122 115.122,533.455 113.5,530.5C 122.833,520.5 132.5,510.833 142.5,501.5 Z"/></g>
|
||||
<g><path style="opacity:0.996" fill="#64b094" d="M 339.5,502.5 C 338.833,503.5 338.167,504.5 337.5,505.5C 335.5,507.167 333.5,508.833 331.5,510.5C 327.642,512.347 323.808,514.347 320,516.5C 316.138,517.198 312.638,519.198 309.5,522.5C 305.605,524.298 301.605,525.798 297.5,527C 295.208,528.29 293.208,529.957 291.5,532C 281.332,535.417 271.665,539.917 262.5,545.5C 261.914,545.291 261.414,544.957 261,544.5C 240.486,554.286 219.319,557.453 197.5,554C 194.492,552.348 191.492,550.848 188.5,549.5C 190.846,546.129 193.179,542.796 195.5,539.5C 201.29,541.713 207.124,544.046 213,546.5C 214.897,544.984 217.064,544.317 219.5,544.5C 227.733,543.536 235.9,543.536 244,544.5C 249.043,542.207 254.21,540.207 259.5,538.5C 260.086,538.709 260.586,539.043 261,539.5C 267.17,535.239 274.003,532.406 281.5,531C 289.446,526.529 297.779,522.862 306.5,520C 317.639,514.344 328.639,508.511 339.5,502.5 Z"/></g>
|
||||
<g><path style="opacity:0.999" fill="#6cb79b" d="M 361.5,508.5 C 358.48,510.523 356.146,513.19 354.5,516.5C 351.384,518.915 348.384,521.581 345.5,524.5C 344.504,524.586 343.671,524.252 343,523.5C 335.273,527.895 328.106,533.061 321.5,539C 319.754,539.471 318.087,540.138 316.5,541C 302.461,552.344 288.461,563.677 274.5,575C 270.659,580.004 266.659,584.837 262.5,589.5C 259.965,595.109 257.632,600.776 255.5,606.5C 254.833,606.5 254.167,606.5 253.5,606.5C 259.811,586.214 270.477,568.547 285.5,553.5C 288.141,551.196 290.808,548.862 293.5,546.5C 300.362,543.149 306.862,539.149 313,534.5C 313.333,534.833 313.667,535.167 314,535.5C 321.839,530.325 329.673,525.158 337.5,520C 342.503,518.155 347.503,515.488 352.5,512C 355.327,510.336 358.327,509.17 361.5,508.5 Z"/></g>
|
||||
<g><path style="opacity:0.988" fill="#75c9a3" d="M 438.5,508.5 C 447.182,510.265 455.849,511.432 464.5,512C 471.806,514.467 478.806,517.634 485.5,521.5C 483.138,524.192 480.804,526.859 478.5,529.5C 461.823,518.894 443.489,514.894 423.5,517.5C 427.071,515.528 430.405,513.195 433.5,510.5C 435.05,509.559 436.716,508.893 438.5,508.5 Z"/></g>
|
||||
<g><path style="opacity:0.988" fill="#67b197" d="M 331.5,510.5 C 328.871,513.631 326.038,516.631 323,519.5C 322.667,519.167 322.333,518.833 322,518.5C 318.466,522.369 314.633,525.869 310.5,529C 304.886,534.823 299.22,540.656 293.5,546.5C 290.808,548.862 288.141,551.196 285.5,553.5C 278.022,559.078 270.022,563.911 261.5,568C 255.127,574.042 248.46,579.708 241.5,585C 237.616,591.027 233.616,596.86 229.5,602.5C 206.365,599.513 185.198,591.513 166,578.5C 165.333,577.5 165.333,576.5 166,575.5C 174.112,567.231 181.612,558.565 188.5,549.5C 191.492,550.848 194.492,552.348 197.5,554C 219.319,557.453 240.486,554.286 261,544.5C 261.414,544.957 261.914,545.291 262.5,545.5C 271.665,539.917 281.332,535.417 291.5,532C 293.208,529.957 295.208,528.29 297.5,527C 301.605,525.798 305.605,524.298 309.5,522.5C 312.638,519.198 316.138,517.198 320,516.5C 323.808,514.347 327.642,512.347 331.5,510.5 Z"/></g>
|
||||
<g><path style="opacity:1" fill="#75c4a3" d="M 433.5,510.5 C 430.405,513.195 427.071,515.528 423.5,517.5C 422.609,518.11 421.609,518.443 420.5,518.5C 420.083,517.876 419.416,517.543 418.5,517.5C 407.59,520.409 396.59,523.243 385.5,526C 379.609,530.113 373.276,533.446 366.5,536C 363.938,538.733 361.271,541.233 358.5,543.5C 359.875,538.043 362.875,533.709 367.5,530.5C 369.167,529.167 370.833,527.833 372.5,526.5C 377.842,524.746 382.675,522.079 387,518.5C 387.414,518.957 387.914,519.291 388.5,519.5C 402.85,512.944 417.85,509.944 433.5,510.5 Z"/></g>
|
||||
<g><path style="opacity:0.99" fill="#60ad91" d="M 293.5,511.5 C 282.967,517.336 272.634,523.67 262.5,530.5C 259.019,532.24 255.352,533.407 251.5,534C 249.007,536.08 246.341,537.914 243.5,539.5C 239.749,539.8 235.916,539.8 232,539.5C 227.711,541.091 223.544,542.758 219.5,544.5C 217.064,544.317 214.897,544.984 213,546.5C 207.124,544.046 201.29,541.713 195.5,539.5C 200.201,531.811 204.868,524.144 209.5,516.5C 213.354,516.841 216.854,518.174 220,520.5C 220.725,519.941 221.558,519.608 222.5,519.5C 235.699,522.801 248.866,522.468 262,518.5C 263.144,518.911 264.311,519.244 265.5,519.5C 275.024,516.462 284.357,513.795 293.5,511.5 Z"/></g>
|
||||
<g><path style="opacity:0.998" fill="#72bda1" d="M 388.5,511.5 C 382.537,515.795 377.204,520.795 372.5,526.5C 370.833,527.833 369.167,529.167 367.5,530.5C 366.85,530.196 366.183,529.863 365.5,529.5C 362.632,531.532 359.632,533.365 356.5,535C 345.322,545.176 333.822,555.009 322,564.5C 316.913,572.341 311.58,580.008 306,587.5C 302.385,594.407 300.219,601.74 299.5,609.5C 298.5,609.5 297.5,609.5 296.5,609.5C 297.645,604.243 298.479,598.909 299,593.5C 303.758,581.981 309.091,570.647 315,559.5C 319.664,554.788 323.831,549.788 327.5,544.5C 337.05,537.035 347.05,530.201 357.5,524C 364.983,520.093 372.65,516.426 380.5,513C 383.168,512.433 385.834,511.933 388.5,511.5 Z"/></g>
|
||||
<g><path style="opacity:0.99" fill="#79caa7" d="M 478.5,529.5 C 471.833,536.833 464.833,543.833 457.5,550.5C 448.288,543.471 437.788,539.471 426,538.5C 417.156,538.149 408.323,538.649 399.5,540C 395.986,541.604 392.319,542.771 388.5,543.5C 389.111,541.225 390.445,539.559 392.5,538.5C 398.359,533.473 404.359,528.64 410.5,524C 413.74,521.909 417.074,520.076 420.5,518.5C 421.609,518.443 422.609,518.11 423.5,517.5C 443.489,514.894 461.823,518.894 478.5,529.5 Z"/></g>
|
||||
<g><path style="opacity:0.945" fill="#48b758" d="M 140.5,517.5 C 138.834,530.161 137.167,542.827 135.5,555.5C 129.474,550.415 124.141,544.749 119.5,538.5C 126.167,531.167 133.167,524.167 140.5,517.5 Z"/></g>
|
||||
<g><path style="opacity:0.998" fill="#79c3a6" d="M 420.5,518.5 C 417.074,520.076 413.74,521.909 410.5,524C 404.359,528.64 398.359,533.473 392.5,538.5C 388.638,539.428 384.971,540.928 381.5,543C 374.21,547.9 367.376,553.4 361,559.5C 360.069,561.459 359.236,563.459 358.5,565.5C 353.748,571.404 349.248,577.404 345,583.5C 343.71,590.698 341.877,598.364 339.5,606.5C 337.5,606.833 335.5,607.167 333.5,607.5C 334.661,599.549 335.495,591.549 336,583.5C 338.479,577.565 340.646,571.565 342.5,565.5C 345.772,560.008 349.272,554.675 353,549.5C 353.483,548.552 353.649,547.552 353.5,546.5C 355.354,545.759 357.021,544.759 358.5,543.5C 361.271,541.233 363.938,538.733 366.5,536C 373.276,533.446 379.609,530.113 385.5,526C 396.59,523.243 407.59,520.409 418.5,517.5C 419.416,517.543 420.083,517.876 420.5,518.5 Z"/></g>
|
||||
<g><path style="opacity:0.891" fill="#57b88a" d="M 554.5,500.5 C 554.5,507.5 554.5,514.5 554.5,521.5C 548.551,529.783 541.884,537.45 534.5,544.5C 534.5,539.833 534.5,535.167 534.5,530.5C 541.592,520.749 548.259,510.749 554.5,500.5 Z"/></g>
|
||||
<g><path style="opacity:0.994" fill="#6fb89e" d="M 345.5,524.5 C 338.453,530.214 332.453,536.881 327.5,544.5C 323.831,549.788 319.664,554.788 315,559.5C 309.091,570.647 303.758,581.981 299,593.5C 298.479,598.909 297.645,604.243 296.5,609.5C 282.855,608.793 269.188,607.793 255.5,606.5C 257.632,600.776 259.965,595.109 262.5,589.5C 266.659,584.837 270.659,580.004 274.5,575C 288.461,563.677 302.461,552.344 316.5,541C 318.087,540.138 319.754,539.471 321.5,539C 328.106,533.061 335.273,527.895 343,523.5C 343.671,524.252 344.504,524.586 345.5,524.5 Z"/></g>
|
||||
<g><path style="opacity:0.989" fill="#75bea3" d="M 367.5,530.5 C 362.875,533.709 359.875,538.043 358.5,543.5C 357.021,544.759 355.354,545.759 353.5,546.5C 348.873,549.653 344.873,553.486 341.5,558C 340.167,558.667 338.833,559.333 337.5,560C 334.158,563.708 330.992,567.541 328,571.5C 324.418,579.003 320.085,586.003 315,592.5C 313.257,597.717 312.09,603.05 311.5,608.5C 307.702,609.483 303.702,609.817 299.5,609.5C 300.219,601.74 302.385,594.407 306,587.5C 311.58,580.008 316.913,572.341 322,564.5C 333.822,555.009 345.322,545.176 356.5,535C 359.632,533.365 362.632,531.532 365.5,529.5C 366.183,529.863 366.85,530.196 367.5,530.5 Z"/></g>
|
||||
<g><path style="opacity:0.864" fill="#60bd92" d="M 534.5,530.5 C 534.5,535.167 534.5,539.833 534.5,544.5C 531.833,547.833 528.833,550.833 525.5,553.5C 525.5,549.833 525.5,546.167 525.5,542.5C 528.512,538.462 531.512,534.462 534.5,530.5 Z"/></g>
|
||||
<g><path style="opacity:0.987" fill="#7fcaac" d="M 457.5,550.5 C 432.519,573 403.852,589.333 371.5,599.5C 371.808,593.575 371.475,587.741 370.5,582C 373.119,574.783 375.452,567.116 377.5,559C 380.139,554.421 383.139,550.088 386.5,546C 385.849,544.692 386.515,543.859 388.5,543.5C 392.319,542.771 395.986,541.604 399.5,540C 408.323,538.649 417.156,538.149 426,538.5C 437.788,539.471 448.288,543.471 457.5,550.5 Z"/></g>
|
||||
<g><path style="opacity:0.992" fill="#78c0a5" d="M 353.5,546.5 C 353.649,547.552 353.483,548.552 353,549.5C 349.272,554.675 345.772,560.008 342.5,565.5C 340.646,571.565 338.479,577.565 336,583.5C 335.495,591.549 334.661,599.549 333.5,607.5C 326.196,608.302 318.862,608.635 311.5,608.5C 312.09,603.05 313.257,597.717 315,592.5C 320.085,586.003 324.418,579.003 328,571.5C 330.992,567.541 334.158,563.708 337.5,560C 338.833,559.333 340.167,558.667 341.5,558C 344.873,553.486 348.873,549.653 353.5,546.5 Z"/></g>
|
||||
<g><path style="opacity:0.985" fill="#7dc5aa" d="M 392.5,538.5 C 390.445,539.559 389.111,541.225 388.5,543.5C 386.515,543.859 385.849,544.692 386.5,546C 383.139,550.088 380.139,554.421 377.5,559C 375.452,567.116 373.119,574.783 370.5,582C 371.475,587.741 371.808,593.575 371.5,599.5C 361.048,602.779 350.382,605.113 339.5,606.5C 341.877,598.364 343.71,590.698 345,583.5C 349.248,577.404 353.748,571.404 358.5,565.5C 359.236,563.459 360.069,561.459 361,559.5C 367.376,553.4 374.21,547.9 381.5,543C 384.971,540.928 388.638,539.428 392.5,538.5 Z"/></g>
|
||||
<g><path style="opacity:0.842" fill="#6bc49b" d="M 525.5,542.5 C 525.5,546.167 525.5,549.833 525.5,553.5C 516.785,561.701 507.451,569.201 497.5,576C 496.241,576.982 494.908,577.315 493.5,577C 504.997,566.092 515.663,554.592 525.5,542.5 Z"/></g>
|
||||
<g><path style="opacity:0.986" fill="#6bb49a" d="M 285.5,553.5 C 270.477,568.547 259.811,586.214 253.5,606.5C 245.268,605.795 237.268,604.461 229.5,602.5C 233.616,596.86 237.616,591.027 241.5,585C 248.46,579.708 255.127,574.042 261.5,568C 270.022,563.911 278.022,559.078 285.5,553.5 Z"/></g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 70 KiB |
46
README.md
46
README.md
@@ -1,30 +1,32 @@
|
||||
<img src="public/image/leaf_banner.png" alt="Leaf">
|
||||
<div align="center">
|
||||
|
||||
[](https://github.com/Winds-Studio/Leaf/releases)⠀
|
||||
[](https://www.leafmc.one/download)⠀
|
||||
[](https://github.com/Winds-Studio/Leaf/actions)⠀
|
||||
[](https://discord.gg/gfgAwdSEuM)
|
||||
[](https://www.leafmc.one/docs/)
|
||||
[](https://www.leafmc.one/docs)
|
||||
|
||||
**Leaf** is a [Paper](https://papermc.io/) fork designed to be customized and high-performance.
|
||||
**Leaf** is a [Paper](https://papermc.io/) fork designed to be customizable and high-performance.
|
||||
</div>
|
||||
|
||||
> [!WARNING]
|
||||
> Leaf is a performance-oriented fork. Make sure to take backups **before** switching to it. Everyone is welcome to contribute by optimizing or reporting issues.
|
||||
> Leaf is a performance-oriented fork. Make sure to take backups **before** switching to it. Everyone is welcome to contribute optimizations or report issues to help us improve.
|
||||
|
||||
**English** | [中文](public/readme/README_CN.md)
|
||||
|
||||
## 🍃 Features
|
||||
- **Based on [Paper](https://papermc.io/)** for generic performance and flexible API
|
||||
- **Async** pathfinding, mob spawning and entity tracker
|
||||
- **Various optimizations** blending from [other forks](https://github.com/Winds-Studio/Leaf#-credits) and our own
|
||||
- **Fully compatible** with Bukkit, Spigot and Paper plugins
|
||||
- **Latest dependencies**, keeping all dependencies in the newest version
|
||||
- **Allows all characters in usernames**, including Chinese and other characters
|
||||
- **Fixes** some Minecraft bugs
|
||||
- **Mod Protocols** support
|
||||
- **More customized** relying on features of [Purpur](https://github.com/PurpurMC/Purpur)
|
||||
- Support for **Linear region file format**
|
||||
- **Maintenance friendly**, integrating with [Sentry](https://sentry.io/welcome/) of [Pufferfish](https://github.com/pufferfish-gg/Pufferfish) to easy track all errors coming from your server in excruciating detail
|
||||
- And more...
|
||||
- **Based on [Paper](https://papermc.io/)** for generic performance and flexible API
|
||||
- **Async** pathfinding, mob spawning and entity tracker
|
||||
- **Various optimizations** blending from [other forks](#-credits) and our own
|
||||
- **Fully compatible** with Spigot and Paper plugins
|
||||
- **Latest dependencies**, keeping all dependencies up-to-date
|
||||
- **Allows all characters in usernames**, including Chinese and other characters
|
||||
- **Fixes** some Minecraft bugs
|
||||
- **Mod Protocols** support
|
||||
- **More customized** relying on features of [Purpur](https://github.com/PurpurMC/Purpur)
|
||||
- **Linear region file format**, to save disk space
|
||||
- **Maintenance friendly**, integrating with [Sentry](https://sentry.io/welcome/) of [Pufferfish](https://github.com/pufferfish-gg/Pufferfish) to easily track all errors coming from your server in extreme detail
|
||||
- And more...
|
||||
|
||||
## 📈 bStats
|
||||
[](https://bstats.org/plugin/server-implementation/Leaf)
|
||||
@@ -37,12 +39,12 @@
|
||||
If you love our work, feel free to donate via our [Open Collective](https://opencollective.com/Winds-Studio) or [Dreeam's AFDIAN](https://afdian.com/a/Dreeam) :)
|
||||
|
||||
## 📥 Download
|
||||
You can find the latest successful build in [GitHub Action](https://github.com/Winds-Studio/Leaf/actions) or [Releases](https://github.com/Winds-Studio/Leaf/releases)
|
||||
Download Leaf from our [website](https://www.leafmc.one/download) or get latest build in [GitHub Action](https://github.com/Winds-Studio/Leaf/actions)
|
||||
|
||||
**Please note Java >= 21 is required.**
|
||||
|
||||
## 📄 Documentation
|
||||
Documentation on how to use/configure Leaf: [www.leafmc.one/docs](https://www.leafmc.one/docs)
|
||||
Documentation about how to use/configure Leaf: [www.leafmc.one/docs](https://www.leafmc.one/docs)
|
||||
|
||||
## 📦 Building
|
||||
Building a Paperclip JAR for distribution:
|
||||
@@ -89,11 +91,11 @@ Paperweight files are licensed under [MIT](licenses/MIT.txt).
|
||||
Patches are licensed under [MIT](licenses/MIT.txt), unless indicated differently in their header.
|
||||
Binaries are licensed under [GPL-3.0](licenses/GPL-3.0.txt).
|
||||
|
||||
Also see [PaperMC/Paper](https://github.com/PaperMC/Paper) and [PaperMC/Paperweight](https://github.com/PaperMC/paperweight) for the license of some material used by this project.
|
||||
Also see [PaperMC/Paper](https://github.com/PaperMC/Paper) and [PaperMC/paperweight](https://github.com/PaperMC/paperweight) for the licenses of some materials used by this project.
|
||||
|
||||
## 📜 Credits
|
||||
Thanks to these projects below. Leaf includes some patches taken from them.<br>
|
||||
If these excellent projects hadn't appeared, Leaf wouldn't have become great.
|
||||
If these excellent projects hadn't existed, Leaf wouldn't have become great.
|
||||
|
||||
- [Gale](https://github.com/Dreeam-qwq/Gale) ([Original Repo](https://github.com/GaleMC/Gale))
|
||||
- [Pufferfish](https://github.com/pufferfish-gg/Pufferfish)
|
||||
@@ -126,9 +128,9 @@ If these excellent projects hadn't appeared, Leaf wouldn't have become great.
|
||||
<a href="https://cloud.swordsman.com.cn/"><img src="public/image/JiankeServer.jpg" alt="Jianke Cloud Host" align="left" hspace="8"></a>
|
||||
cloud of swordsman | 剑客云
|
||||
|
||||
If you want to find a cheaper, high performance, stable with lower latency, then cloud of swordsman is a good choice! Registers and purchases in [here](https://cloud.swordsman.com.cn/?i8ab42c).
|
||||
If you want to find a cheaper, high performance, stable, lower latency host, then cloud of swordsman is a good choice! Registers and purchases in [here](https://cloud.swordsman.com.cn/?i8ab42c).
|
||||
|
||||
如果你想找一个低价高性能, 低延迟的云服务商,剑客云是个不错的选择! 你可以在[这里](https://cloud.swordsman.com.cn/?i8ab42c)注册.
|
||||
如果你想找一个低价高性能、低延迟的云服务商,剑客云是个不错的选择!你可以在 [这里](https://cloud.swordsman.com.cn/?i8ab42c) 注册。
|
||||
|
||||
---
|
||||

|
||||
|
||||
@@ -4,6 +4,8 @@ protected net.minecraft.world.entity.Entity dimensions
|
||||
protected net.minecraft.world.entity.ai.goal.RemoveBlockGoal blockToRemove
|
||||
protected net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal getTargetConditions()Lnet/minecraft/world/entity/ai/targeting/TargetingConditions;
|
||||
protected-f net.minecraft.world.level.block.state.BlockBehaviour$BlockStateBase$Cache largeCollisionShape
|
||||
public net.minecraft.core.Direction VALUES
|
||||
public net.minecraft.server.level.ServerChunkCache fullChunks
|
||||
public net.minecraft.server.level.ServerEntity sendDirtyEntityData()V
|
||||
public net.minecraft.server.players.PlayerList SEND_PLAYER_INFO_INTERVAL
|
||||
public net.minecraft.util.Mth SIN
|
||||
|
||||
@@ -8,6 +8,3 @@ org.gradle.configuration-cache=true
|
||||
org.gradle.caching=true
|
||||
org.gradle.parallel=true
|
||||
org.gradle.vfs.watch=false
|
||||
leaf.patcher.repo-cache=enabled
|
||||
leaf.patcher.patch-cache=enabled
|
||||
leaf.patcher.fast-update=true
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
api("org.apache.logging.log4j:log4j-api:$log4jVersion")
|
||||
api("org.slf4j:slf4j-api:$slf4jVersion")
|
||||
api("com.mojang:brigadier:1.3.10")
|
||||
+ api("io.sentry:sentry:8.4.0") // Pufferfish
|
||||
+ api("io.sentry:sentry:8.13.2") // Pufferfish
|
||||
|
||||
// Deprecate bungeecord-chat in favor of adventure
|
||||
api("net.md-5:bungeecord-chat:$bungeeCordChatVersion") {
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
package org.dreeam.leaf.event;
|
||||
|
||||
import org.bukkit.ExplosionResult;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.event.Cancellable;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.block.BlockEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Called when a block executes its explosion hit actions.
|
||||
* If the event is cancelled, the block will not execute the explosion hit actions.
|
||||
*/
|
||||
public class BlockExplosionHitEvent extends BlockEvent implements Cancellable {
|
||||
private static final HandlerList handlers = new HandlerList();
|
||||
private boolean cancelled;
|
||||
private final Entity source;
|
||||
private final ExplosionResult result;
|
||||
|
||||
public BlockExplosionHitEvent(@NotNull Block block, Entity source, ExplosionResult result) {
|
||||
super(block);
|
||||
this.source = source;
|
||||
this.result = result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HandlerList getHandlers() {
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public static HandlerList getHandlerList() {
|
||||
return handlers;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCancelled() {
|
||||
return cancelled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCancelled(boolean cancel) {
|
||||
this.cancelled = cancel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the entity responsible for the explosion.
|
||||
*
|
||||
* @return Entity responsible for the explosion
|
||||
*/
|
||||
public Entity getSource() {
|
||||
return source;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the result of the explosion.
|
||||
*
|
||||
* @return the result of the explosion
|
||||
*/
|
||||
public ExplosionResult getResult() {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com>
|
||||
Date: Wed, 31 Jul 2024 22:05:21 +0800
|
||||
Subject: [PATCH] Leaf Bootstrap
|
||||
|
||||
Removed since Leaf 1.21.4, useless
|
||||
|
||||
org.bukkit.craftbukkit.Main#main -> LeafBootstrap -> PaperBootstrap -> ...
|
||||
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java
|
||||
index ecb0fcd1f3b3f3d7751eded3cdf0977c1889c9ed..d0becb56a9911ef4cc55ae8d7c47832f442ad52f 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/Main.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/Main.java
|
||||
@@ -278,7 +278,8 @@ public class Main {
|
||||
System.setProperty("jdk.console", "java.base"); // Paper - revert default console provider back to java.base so we can have our own jline
|
||||
//System.out.println("Loading libraries, please wait...");
|
||||
//net.minecraft.server.Main.main(options);
|
||||
- io.papermc.paper.PaperBootstrap.boot(options);
|
||||
+ //io.papermc.paper.PaperBootstrap.boot(options); // Leaf - Leaf Boostrap - diff on change
|
||||
+ org.dreeam.leaf.LeafBootstrap.boot(options); // Leaf - Leaf Boostrap
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
@@ -3,16 +3,18 @@ From: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com>
|
||||
Date: Tue, 9 Nov 2077 00:00:00 +0800
|
||||
Subject: [PATCH] Smooth teleport config
|
||||
|
||||
Removed since Leaf 1.21.4
|
||||
|
||||
This abuses some of how Minecraft works and attempts to teleport a player to another world without
|
||||
triggering typical respawn packets. All of natural state of chunk resends, entity adds/removes, etc still
|
||||
happen but the visual "refresh" of a world change is hidden. Depending on the destination location/world,
|
||||
this can act as a "smooth teleport" to a world if the new world is very similar looking to the old one.
|
||||
|
||||
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
|
||||
index 18125ed336c3425f123232b405a8af9ee3a2ba7d..e97a93c97e1822f969dce2d30dd915db5d3d14cf 100644
|
||||
index 4f01b53bf801f99253efd27df6216912705d18af..82a1715fea41e6a41c4ff441ea89f424f68ba190 100644
|
||||
--- a/net/minecraft/server/level/ServerPlayer.java
|
||||
+++ b/net/minecraft/server/level/ServerPlayer.java
|
||||
@@ -1419,6 +1419,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||
@@ -1469,6 +1469,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||
LevelData worlddata = level.getLevelData();
|
||||
|
||||
this.connection.send(new ClientboundRespawnPacket(this.createCommonSpawnInfo(level), (byte) 3));
|
||||
@@ -20,9 +22,9 @@ index 18125ed336c3425f123232b405a8af9ee3a2ba7d..e97a93c97e1822f969dce2d30dd915db
|
||||
this.connection.send(new ClientboundChangeDifficultyPacket(worlddata.getDifficulty(), worlddata.isDifficultyLocked()));
|
||||
PlayerList playerList = this.server.getPlayerList();
|
||||
|
||||
@@ -1428,7 +1429,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||
@@ -1478,7 +1479,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||
// CraftBukkit end
|
||||
this.portalPos = org.bukkit.craftbukkit.util.CraftLocation.toBlockPosition(exit); // Purpur - Fix stuck in portals
|
||||
this.portalPos = io.papermc.paper.util.MCUtil.toBlockPosition(exit); // Purpur - Fix stuck in portals
|
||||
this.setServerLevel(level);
|
||||
- this.connection.internalTeleport(PositionMoveRotation.of(teleportTransition), teleportTransition.relatives()); // CraftBukkit - use internal teleport without event
|
||||
+ if (!org.dreeam.leaf.config.modules.gameplay.SmoothTeleport.enabled || !PlayerList.isSameLogicalHeight(serverLevel, level)) this.connection.internalTeleport(PositionMoveRotation.of(teleportTransition), teleportTransition.relatives()); // CraftBukkit - use internal teleport without event // Leaf - Smooth teleport
|
||||
@@ -30,10 +32,10 @@ index 18125ed336c3425f123232b405a8af9ee3a2ba7d..e97a93c97e1822f969dce2d30dd915db
|
||||
level.addDuringTeleport(this);
|
||||
this.triggerDimensionChangeTriggers(serverLevel);
|
||||
diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java
|
||||
index 34c5c2e3d6b0706cb91ec0171969cf81e94741a4..8b1652805a2ac9ebae9c99dd77e81c7a484a7abb 100644
|
||||
index 75fb49f1596f475278d12c8c7aea9ad4952b6056..b17c8a2f5294ac28cc05fb05c84a041b2c6c8721 100644
|
||||
--- a/net/minecraft/server/players/PlayerList.java
|
||||
+++ b/net/minecraft/server/players/PlayerList.java
|
||||
@@ -956,11 +956,11 @@ public abstract class PlayerList {
|
||||
@@ -955,11 +955,11 @@ public abstract class PlayerList {
|
||||
byte b = (byte)(keepInventory ? 1 : 0);
|
||||
ServerLevel serverLevel = serverPlayer.serverLevel();
|
||||
LevelData levelData = serverLevel.getLevelData();
|
||||
@@ -3,12 +3,13 @@ From: Taiyou06 <kaandindar21@gmail.com>
|
||||
Date: Tue, 9 Nov 2077 00:00:00 +0800
|
||||
Subject: [PATCH] Collect then startEachNonRunningBehavior in Brain
|
||||
|
||||
Removed since Leaf 1.21.4, replaced by Cache potential behaviors in Brain patch
|
||||
|
||||
diff --git a/net/minecraft/world/entity/ai/Brain.java b/net/minecraft/world/entity/ai/Brain.java
|
||||
index b946faf899561b9e4f8399e16600eede54bb55a5..b2e17d387558875f45a8458cf874a5b056820432 100644
|
||||
index c561b749fb9b76ba9b1e9689089b743248c65d50..ea6c8e85ccff67b1c24109732f74f1e8199cad07 100644
|
||||
--- a/net/minecraft/world/entity/ai/Brain.java
|
||||
+++ b/net/minecraft/world/entity/ai/Brain.java
|
||||
@@ -462,20 +462,29 @@ public class Brain<E extends LivingEntity> {
|
||||
@@ -453,20 +453,29 @@ public class Brain<E extends LivingEntity> {
|
||||
}
|
||||
|
||||
private void startEachNonRunningBehavior(ServerLevel level, E entity) {
|
||||
@@ -3,7 +3,7 @@ From: Taiyou06 <kaandindar21@gmail.com>
|
||||
Date: Fri, 7 Feb 2025 21:41:51 +0100
|
||||
Subject: [PATCH] Cache ItemStack max stack size
|
||||
|
||||
TODO: check this, fix get max stack size
|
||||
Abandoned plan, maybe research deeper in this part in the future, maybe not
|
||||
|
||||
diff --git a/net/minecraft/world/item/ItemStack.java b/net/minecraft/world/item/ItemStack.java
|
||||
index fd7c1e800cbd4919a1a47f6c468c8776535bd028..fdd7e89bacc98e23f067ba17d0bd93ee84a388cb 100644
|
||||
@@ -1,108 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com>
|
||||
Date: Sat, 6 Apr 2024 22:57:41 -0400
|
||||
Subject: [PATCH] Optimize Minecart collisions
|
||||
|
||||
Co-authored-by: MrHua269 <wangxyper@163.com>
|
||||
|
||||
Skip tick collisions to to prevent lag causing by massive stacked Minecart
|
||||
Useful for anarchy server.
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/EntitySelector.java b/src/main/java/net/minecraft/world/entity/EntitySelector.java
|
||||
index 4830ebddade00f62287bcc9d7b17be83c0ad3a56..fca917561944017e032ea39ffb22cbd2c89b9f51 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/EntitySelector.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/EntitySelector.java
|
||||
@@ -63,6 +63,13 @@ public final class EntitySelector {
|
||||
}
|
||||
public static Predicate<Entity> pushable(Entity entity, boolean ignoreClimbing) {
|
||||
// Paper end - Climbing should not bypass cramming gamerule
|
||||
+
|
||||
+ // Leaf start - Optimize Minecart collisions
|
||||
+ if (entity instanceof net.minecraft.world.entity.vehicle.AbstractMinecart) {
|
||||
+ return x -> true;
|
||||
+ }
|
||||
+ // Leaf end - Optimize Minecart collisions
|
||||
+
|
||||
PlayerTeam scoreboardteam = entity.getTeam();
|
||||
Team.CollisionRule scoreboardteambase_enumteampush = scoreboardteam == null ? Team.CollisionRule.ALWAYS : scoreboardteam.getCollisionRule();
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java
|
||||
index 8b1c00062a5272d1020bc85491d8627c4d5f46cb..ec437f625f10098c008571569abb89ad4af52781 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java
|
||||
@@ -386,15 +386,15 @@ public abstract class AbstractMinecart extends VehicleEntity {
|
||||
this.level().getCraftServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleMoveEvent(vehicle, from, to));
|
||||
}
|
||||
// CraftBukkit end
|
||||
- if (this.getMinecartType() == AbstractMinecart.Type.RIDEABLE && this.getDeltaMovement().horizontalDistanceSqr() > 0.01D) {
|
||||
+ // Leaf start - Optimize Minecart collision handling
|
||||
+ // The logic below is used to get list of entities around Minecart
|
||||
+ // and handle behaviors for their collisions with each other
|
||||
+ if (!org.dreeam.leaf.config.modules.opt.OptimizeMinecart.enabled || this.tickCount % org.dreeam.leaf.config.modules.opt.OptimizeMinecart.skipTickCount == 0) {
|
||||
+ if (this.getMinecartType() == AbstractMinecart.Type.RIDEABLE && (org.dreeam.leaf.config.modules.opt.OptimizeMinecart.enabled || this.getDeltaMovement().horizontalDistanceSqr() > 0.01D)) {
|
||||
List<Entity> list = this.level().getEntities((Entity) this, this.getBoundingBox().inflate(0.20000000298023224D, 0.0D, 0.20000000298023224D), EntitySelector.pushableBy(this));
|
||||
|
||||
if (!list.isEmpty()) {
|
||||
- Iterator iterator = list.iterator();
|
||||
-
|
||||
- while (iterator.hasNext()) {
|
||||
- Entity entity = (Entity) iterator.next();
|
||||
-
|
||||
+ for (Entity entity : list) {
|
||||
if (!(entity instanceof Player) && !(entity instanceof IronGolem) && !(entity instanceof AbstractMinecart) && !this.isVehicle() && !entity.isPassenger()) {
|
||||
// CraftBukkit start
|
||||
VehicleEntityCollisionEvent collisionEvent = new VehicleEntityCollisionEvent(vehicle, entity.getBukkitEntity());
|
||||
@@ -421,11 +421,7 @@ public abstract class AbstractMinecart extends VehicleEntity {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
- Iterator iterator1 = this.level().getEntities(this, this.getBoundingBox().inflate(0.20000000298023224D, 0.0D, 0.20000000298023224D)).iterator();
|
||||
-
|
||||
- while (iterator1.hasNext()) {
|
||||
- Entity entity1 = (Entity) iterator1.next();
|
||||
-
|
||||
+ for (Entity entity1 : this.level().getEntities(this, this.getBoundingBox().inflate(0.20000000298023224D, 0.0D, 0.20000000298023224D))) {
|
||||
if (!this.hasPassenger(entity1) && entity1.isPushable() && entity1 instanceof AbstractMinecart) {
|
||||
// CraftBukkit start
|
||||
VehicleEntityCollisionEvent collisionEvent = new VehicleEntityCollisionEvent(vehicle, entity1.getBukkitEntity());
|
||||
@@ -439,6 +435,8 @@ public abstract class AbstractMinecart extends VehicleEntity {
|
||||
}
|
||||
}
|
||||
}
|
||||
+ }
|
||||
+ // Leaf end
|
||||
|
||||
this.updateInWaterStateAndDoFluidPushing();
|
||||
if (this.isInLava()) {
|
||||
diff --git a/src/main/java/org/dreeam/leaf/config/modules/opt/OptimizeMinecart.java b/src/main/java/org/dreeam/leaf/config/modules/opt/OptimizeMinecart.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..8ca03c5abfb9e11dfbb6e65453052780e289c686
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/org/dreeam/leaf/config/modules/opt/OptimizeMinecart.java
|
||||
@@ -0,0 +1,26 @@
|
||||
+package org.dreeam.leaf.config.modules.opt;
|
||||
+
|
||||
+import org.dreeam.leaf.config.ConfigModules;
|
||||
+import org.dreeam.leaf.config.EnumConfigCategory;
|
||||
+
|
||||
+public class OptimizeMinecart extends ConfigModules {
|
||||
+
|
||||
+ public String getBasePath() {
|
||||
+ return EnumConfigCategory.PERF.getBaseKeyName() + ".optimize-minecart";
|
||||
+ }
|
||||
+
|
||||
+ public static boolean enabled = false;
|
||||
+ public static int skipTickCount = 30;
|
||||
+
|
||||
+ @Override
|
||||
+ public void onLoaded() {
|
||||
+ enabled = config.getBoolean(getBasePath() + ".enabled", enabled, config.pickStringRegionBased("""
|
||||
+ Enable this feature to handle a large amount of stacked minecarts better.
|
||||
+ By skipping tick collisions to reduce expensive getEntities
|
||||
+ and bukkit event calls, useful for anarchy servers.
|
||||
+ """,
|
||||
+ """
|
||||
+ 开启此项可更好地承受大量堆叠矿车. (通过跳过碰撞 tick 的方式)"""));
|
||||
+ skipTickCount = config.getInt(getBasePath() + ".skip-tick-count", skipTickCount);
|
||||
+ }
|
||||
+}
|
||||
@@ -0,0 +1,204 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: hayanesuru <hayanesuru@outlook.jp>
|
||||
Date: Tue, 3 Jun 2025 15:20:59 +0900
|
||||
Subject: [PATCH] optimize mob spawning
|
||||
|
||||
|
||||
diff --git a/net/minecraft/server/level/ServerChunkCache.java b/net/minecraft/server/level/ServerChunkCache.java
|
||||
index f57f8e610dac80b8095bfc0c7e4b22ff5ad6b13c..c1efd558cfbfd2200295ef5755aa496e95deb7d7 100644
|
||||
--- a/net/minecraft/server/level/ServerChunkCache.java
|
||||
+++ b/net/minecraft/server/level/ServerChunkCache.java
|
||||
@@ -70,7 +70,9 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
|
||||
private final Set<ChunkHolder> chunkHoldersToBroadcast = new ReferenceOpenHashSet<>();
|
||||
@Nullable
|
||||
@VisibleForDebug
|
||||
- private NaturalSpawner.SpawnState lastSpawnState;
|
||||
+ private volatile NaturalSpawner.SpawnState lastSpawnState; // Leaf - optimize mob spawning
|
||||
+ private long delayTimeInhabited = 0L; // Leaf - optimize mob spawning
|
||||
+ private long delaySpawn = -1L; // Leaf - optimize mob spawning
|
||||
// Paper start
|
||||
public final ca.spottedleaf.concurrentutil.map.ConcurrentLong2ReferenceChainedHashTable<net.minecraft.world.level.chunk.LevelChunk> fullChunks = new ca.spottedleaf.concurrentutil.map.ConcurrentLong2ReferenceChainedHashTable<>();
|
||||
public int getFullChunksCount() {
|
||||
@@ -655,13 +657,37 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
|
||||
filteredSpawningCategories = List.of();
|
||||
}
|
||||
|
||||
- for (LevelChunk levelChunk : chunks) {
|
||||
- ChunkPos pos = levelChunk.getPos();
|
||||
- levelChunk.incrementInhabitedTime(timeInhabited);
|
||||
- if (!filteredSpawningCategories.isEmpty() && this.level.getWorldBorder().isWithinBounds(pos) && lastSpawnState != null && (!org.dreeam.leaf.config.modules.async.AsyncMobSpawning.enabled || _pufferfish_spawnCountsReady.get()) && this.chunkMap.anyPlayerCloseEnoughForSpawning(pos, true)) { // Spigot // Pufferfish // Leaf - Don't spawn if lastSpawnState is null
|
||||
- NaturalSpawner.spawnForChunk(this.level, levelChunk, lastSpawnState, filteredSpawningCategories); // Pufferfish
|
||||
+ // Leaf start - optimize mob spawning
|
||||
+ var lastSpawnState1 = this.lastSpawnState;
|
||||
+ if (lastSpawnState1 != null && (!org.dreeam.leaf.config.modules.async.AsyncMobSpawning.enabled || _pufferfish_spawnCountsReady.get())) {
|
||||
+ long sumTimeInhabited = timeInhabited + delayTimeInhabited;
|
||||
+ long time = level.getGameTime();
|
||||
+ for (LevelChunk levelChunk : chunks) {
|
||||
+ ChunkPos pos = levelChunk.getPos();
|
||||
+ levelChunk.incrementInhabitedTime(sumTimeInhabited);
|
||||
+ if (!filteredSpawningCategories.isEmpty() && this.level.getWorldBorder().isWithinBounds(pos) && this.chunkMap.anyPlayerCloseEnoughForSpawning(pos, true)) { // Spigot
|
||||
+ NaturalSpawner.spawnForChunk(this.level, levelChunk, lastSpawnState1, filteredSpawningCategories, time); // Pufferfish
|
||||
+ }
|
||||
+ }
|
||||
+ if (delaySpawn != -1L) {
|
||||
+ time = delaySpawn;
|
||||
+ for (LevelChunk levelChunk : chunks) {
|
||||
+ ChunkPos pos = levelChunk.getPos();
|
||||
+ if (!filteredSpawningCategories.isEmpty() && this.level.getWorldBorder().isWithinBounds(pos) && this.chunkMap.anyPlayerCloseEnoughForSpawning(pos, true)) { // Spigot
|
||||
+ NaturalSpawner.spawnForChunk(this.level, levelChunk, lastSpawnState1, filteredSpawningCategories, time); // Pufferfish
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
+ delaySpawn = -1L;
|
||||
+ delayTimeInhabited = 0L;
|
||||
+ } else {
|
||||
+ // unlikely
|
||||
+ delayTimeInhabited += timeInhabited;
|
||||
+ delaySpawn = level.getGameTime();
|
||||
+ }
|
||||
+ // Leaf end - optimize mob spawning
|
||||
|
||||
+ for (LevelChunk levelChunk : chunks) { // Leaf - optimize mob spawning - split to 2 loop
|
||||
if (true) { // Paper - rewrite chunk system
|
||||
this.level.tickChunk(levelChunk, _int);
|
||||
}
|
||||
diff --git a/net/minecraft/world/level/NaturalSpawner.java b/net/minecraft/world/level/NaturalSpawner.java
|
||||
index 9b37b763c6555705f3e256010f508b5a0c2cdb66..bde7008e14a3b4c0a37a94a4890e2f7fa1ce2466 100644
|
||||
--- a/net/minecraft/world/level/NaturalSpawner.java
|
||||
+++ b/net/minecraft/world/level/NaturalSpawner.java
|
||||
@@ -155,7 +155,13 @@ public final class NaturalSpawner {
|
||||
return list;
|
||||
}
|
||||
|
||||
+ @Deprecated(forRemoval = true) // Leaf - optimize mob spawning
|
||||
public static void spawnForChunk(ServerLevel level, LevelChunk chunk, NaturalSpawner.SpawnState spawnState, List<MobCategory> categories) {
|
||||
+ // Leaf start - optimize mob spawning
|
||||
+ spawnForChunk(level, chunk, spawnState, categories, level.getGameTime());
|
||||
+ }
|
||||
+ public static void spawnForChunk(ServerLevel level, LevelChunk chunk, NaturalSpawner.SpawnState spawnState, List<MobCategory> categories, long gameTime) {
|
||||
+ // Leaf end - optimize mob spawning
|
||||
for (MobCategory mobCategory : categories) {
|
||||
// Paper start - Optional per player mob spawns
|
||||
final boolean canSpawn;
|
||||
@@ -174,7 +180,7 @@ public final class NaturalSpawner {
|
||||
}
|
||||
// Paper end - throttle failed spawn attempts
|
||||
if (CraftSpawnCategory.isValidForLimits(spawnCategory)) {
|
||||
- spawnThisTick = ticksPerSpawnTmp != 0 && level.getGameTime() % ticksPerSpawn == 0; // Paper - throttle failed spawn attempts
|
||||
+ spawnThisTick = ticksPerSpawnTmp != 0 && gameTime % ticksPerSpawn == 0; // Paper - throttle failed spawn attempts // Leaf - optimize mob spawning
|
||||
limit = level.getWorld().getSpawnLimit(spawnCategory);
|
||||
}
|
||||
|
||||
@@ -238,12 +244,14 @@ public final class NaturalSpawner {
|
||||
// Paper end - throttle failed spawn attempts
|
||||
) {
|
||||
// Paper end - Optional per player mob spawns
|
||||
- BlockPos randomPosWithin = getRandomPosWithin(level, chunk);
|
||||
- if (randomPosWithin.getY() >= level.getMinY() + 1) {
|
||||
- return spawnCategoryForPosition(category, level, chunk, randomPosWithin, filter, callback, maxSpawns, trackEntity, false); // Paper - Optional per player mob spawns // Paper - throttle failed spawn attempts
|
||||
+ // Leaf start - optimize mob spawning
|
||||
+ BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos();
|
||||
+ mutableRandomPosWithin(pos, level, chunk);
|
||||
+ if (pos.getY() < level.getMinY() + 1) {
|
||||
+ return 0;
|
||||
}
|
||||
-
|
||||
- return 0; // Paper - throttle failed spawn attempts
|
||||
+ return spawnCategoryForPosition(category, level, chunk, pos, filter, callback, maxSpawns, trackEntity, false); // Paper - Optional per player mob spawns // Paper - throttle failed spawn attempts
|
||||
+ // Leaf end - optimize mob spawning
|
||||
}
|
||||
|
||||
@VisibleForDebug
|
||||
@@ -275,31 +283,55 @@ public final class NaturalSpawner {
|
||||
StructureManager structureManager = level.structureManager();
|
||||
ChunkGenerator generator = level.getChunkSource().getGenerator();
|
||||
int y = pos.getY();
|
||||
+ int posX = pos.getX(); // Leaf - optimize mob spawning
|
||||
+ int posZ = pos.getZ(); // Leaf - optimize mob spawning
|
||||
int i = 0; // Paper - throttle failed spawn attempts
|
||||
BlockState blockState = level.getBlockStateIfLoadedAndInBounds(pos); // Paper - don't load chunks for mob spawn
|
||||
if (blockState != null && !blockState.isRedstoneConductor(chunk, pos)) { // Paper - don't load chunks for mob spawn
|
||||
- BlockPos.MutableBlockPos mutableBlockPos = new BlockPos.MutableBlockPos();
|
||||
+ BlockPos.MutableBlockPos mutableBlockPos = pos instanceof BlockPos.MutableBlockPos pos2 ? pos2 : new BlockPos.MutableBlockPos(); // Leaf - optimize mob spawning
|
||||
//int i = 0; // Paper - throttle failed spawn attempts - move up
|
||||
|
||||
+ // Leaf start - optimize mob spawning
|
||||
+ long rand = level.random.nextLong();
|
||||
+ int bits = 0;
|
||||
for (int i1 = 0; i1 < 3; i1++) {
|
||||
- int x = pos.getX();
|
||||
- int z = pos.getZ();
|
||||
- int i2 = 6;
|
||||
+ int x = posX;
|
||||
+ int z = posZ;
|
||||
MobSpawnSettings.SpawnerData spawnerData = null;
|
||||
SpawnGroupData spawnGroupData = null;
|
||||
- int ceil = Mth.ceil(level.random.nextFloat() * 4.0F);
|
||||
+ int ceil = (int) ((rand & 0x3L) + 1L);
|
||||
+ bits += 2;
|
||||
int i3 = 0;
|
||||
|
||||
for (int i4 = 0; i4 < ceil; i4++) {
|
||||
- x += level.random.nextInt(6) - level.random.nextInt(6);
|
||||
- z += level.random.nextInt(6) - level.random.nextInt(6);
|
||||
+ int rand1=0,rand2=0,rand3=0,rand4=0,valuesNeeded=4;
|
||||
+ while (valuesNeeded > 0) {
|
||||
+ if (bits > 61) {
|
||||
+ rand = level.random.nextLong();
|
||||
+ bits = 0;
|
||||
+ }
|
||||
+ int threeBits = (int) ((rand >>> bits) & 0x7L);
|
||||
+ bits += 3;
|
||||
+ if (threeBits != 7 && threeBits != 6) {
|
||||
+ switch (valuesNeeded) {
|
||||
+ case 1 -> rand4 = threeBits;
|
||||
+ case 2 -> rand3 = threeBits;
|
||||
+ case 3 -> rand2 = threeBits;
|
||||
+ case 4 -> rand1 = threeBits;
|
||||
+ }
|
||||
+ valuesNeeded--;
|
||||
+ }
|
||||
+ }
|
||||
+ x += rand1 - rand2;
|
||||
+ z += rand3 - rand4;
|
||||
+ // Leaf end - optimize mob spawning
|
||||
mutableBlockPos.set(x, y, z);
|
||||
double d = x + 0.5;
|
||||
double d1 = z + 0.5;
|
||||
Player nearestPlayer = level.getNearestPlayer(d, y, d1, -1.0, level.purpurConfig.mobSpawningIgnoreCreativePlayers); // Purpur - mob spawning option to ignore creative players
|
||||
if (nearestPlayer != null) {
|
||||
double d2 = nearestPlayer.distanceToSqr(d, y, d1);
|
||||
- if (level.isLoadedAndInBounds(mutableBlockPos) && isRightDistanceToPlayerAndSpawnPoint(level, chunk, mutableBlockPos, d2)) { // Paper - don't load chunks for mob spawn
|
||||
+ if (level.getWorldBorder().isWithinBounds(mutableBlockPos) && (chunk.getPos().longKey == ChunkPos.asLong(mutableBlockPos) || level.getChunkIfLoadedImmediately(mutableBlockPos.getX() >> 4, mutableBlockPos.getZ() >> 4) != null) && isRightDistanceToPlayerAndSpawnPoint(level, chunk, mutableBlockPos, d2)) { // Paper - don't load chunks for mob spawn // Leaf - optimize mob spawning
|
||||
if (spawnerData == null) {
|
||||
Optional<MobSpawnSettings.SpawnerData> randomSpawnMobAt = getRandomSpawnMobAt(
|
||||
level, structureManager, generator, category, level.random, mutableBlockPos
|
||||
@@ -368,8 +400,8 @@ public final class NaturalSpawner {
|
||||
|
||||
private static boolean isRightDistanceToPlayerAndSpawnPoint(ServerLevel level, ChunkAccess chunk, BlockPos.MutableBlockPos pos, double distance) {
|
||||
return !(distance <= 576.0)
|
||||
- && !level.getSharedSpawnPos().closerToCenterThan(new Vec3(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5), 24.0)
|
||||
- && (Objects.equals(new ChunkPos(pos), chunk.getPos()) || level.isNaturalSpawningAllowed(pos));
|
||||
+ && !(level.getSharedSpawnPos().distToCenterSqr(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5) < 576.0) // Leaf - optimize mob spawning
|
||||
+ && (ChunkPos.asLong(pos) == chunk.getPos().longKey || level.isNaturalSpawningAllowed(pos)); // Leaf - optimize mob spawning
|
||||
}
|
||||
|
||||
// Paper start - PreCreatureSpawnEvent
|
||||
@@ -474,6 +506,17 @@ public final class NaturalSpawner {
|
||||
}
|
||||
}
|
||||
|
||||
+ // Leaf start - optimize mob spawning
|
||||
+ private static void mutableRandomPosWithin(BlockPos.MutableBlockPos pos1, Level level, LevelChunk chunk) {
|
||||
+ ChunkPos pos = chunk.getPos();
|
||||
+ int randomX = pos.getMinBlockX() + level.random.nextInt(16);
|
||||
+ int randomZ = pos.getMinBlockZ() + level.random.nextInt(16);
|
||||
+ int surfaceY = chunk.getHeight(Heightmap.Types.WORLD_SURFACE, randomX, randomZ) + 1;
|
||||
+ int randomY = Mth.randomBetweenInclusive(level.random, level.getMinY(), surfaceY);
|
||||
+ pos1.set(randomX, randomY, randomZ);
|
||||
+ }
|
||||
+ // Leaf end - optimize mob spawning
|
||||
+
|
||||
private static BlockPos getRandomPosWithin(Level level, LevelChunk chunk) {
|
||||
ChunkPos pos = chunk.getPos();
|
||||
int i = pos.getMinBlockX() + level.random.nextInt(16);
|
||||
@@ -22,7 +22,7 @@ and, in my opinion, worth the low risk of minor mob-spawning-related
|
||||
inconsistencies.
|
||||
|
||||
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
|
||||
index 99e9fe7562520e37f8b0fa938b53a973b23c65c3..ff1f5943cb99353df6069060c67da86516c9c956 100644
|
||||
index c1b3d2b4c56b657ff51c8b27b4b80e0c0d01ddbe..18a0bf81562f61fd6ede72d51d836ae28e9226c3 100644
|
||||
--- a/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/net/minecraft/server/MinecraftServer.java
|
||||
@@ -285,6 +285,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -33,6 +33,14 @@ index 99e9fe7562520e37f8b0fa938b53a973b23c65c3..ff1f5943cb99353df6069060c67da865
|
||||
|
||||
public static <S extends MinecraftServer> S spin(Function<Thread, S> threadFunction) {
|
||||
AtomicReference<S> atomicReference = new AtomicReference<>();
|
||||
@@ -1046,6 +1047,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
// Paper end - rewrite chunk system
|
||||
// Paper start - Improved watchdog support - move final shutdown items here
|
||||
Util.shutdownExecutors();
|
||||
+ org.dreeam.leaf.async.ShutdownExecutors.shutdown(this); // Leaf
|
||||
try {
|
||||
net.minecrell.terminalconsole.TerminalConsoleAppender.close(); // Paper - Use TerminalConsoleAppender
|
||||
} catch (final Exception ignored) {
|
||||
diff --git a/net/minecraft/server/dedicated/DedicatedServer.java b/net/minecraft/server/dedicated/DedicatedServer.java
|
||||
index cd266af35c7b8455af19adc9b0874cdd7572217f..349eafa321c955c6bda7a5aa6931311d85867565 100644
|
||||
--- a/net/minecraft/server/dedicated/DedicatedServer.java
|
||||
@@ -47,7 +55,7 @@ index cd266af35c7b8455af19adc9b0874cdd7572217f..349eafa321c955c6bda7a5aa6931311d
|
||||
}
|
||||
}
|
||||
diff --git a/net/minecraft/server/level/ServerChunkCache.java b/net/minecraft/server/level/ServerChunkCache.java
|
||||
index 52cef9fed4a68d16d89eabacbad073ead0685972..229e115447b06db3e3b440ee8ea0505979656846 100644
|
||||
index 3d7d336c2043b533012ee390e6da02ac4f64e1f2..e67196b815dad6baa823822285cff83848e549ce 100644
|
||||
--- a/net/minecraft/server/level/ServerChunkCache.java
|
||||
+++ b/net/minecraft/server/level/ServerChunkCache.java
|
||||
@@ -182,6 +182,8 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
|
||||
|
||||
@@ -307,7 +307,7 @@ index 6c65122fe15e08c352885c7dfd3ddf496f0c00c4..bff3da0fba99532889976281dba70d65
|
||||
io.papermc.paper.plugin.PluginInitializerManager.load(optionSet); // Paper
|
||||
Bootstrap.bootStrap();
|
||||
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
|
||||
index af17193fde9d4c13e84fb7952521430299f2cfec..5c0e7804555f9b789a96a98008dd1edf0be68104 100644
|
||||
index 18a0bf81562f61fd6ede72d51d836ae28e9226c3..271233087ad8a0ef8e90e1d518907e166f8235a2 100644
|
||||
--- a/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/net/minecraft/server/MinecraftServer.java
|
||||
@@ -265,6 +265,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -343,7 +343,7 @@ index af17193fde9d4c13e84fb7952521430299f2cfec..5c0e7804555f9b789a96a98008dd1edf
|
||||
// CraftBukkit start
|
||||
if (this.server != null) {
|
||||
this.server.spark.disable(); // Paper - spark
|
||||
@@ -1073,6 +1085,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -1074,6 +1086,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
this.safeShutdown(waitForServer, false);
|
||||
}
|
||||
public void safeShutdown(boolean waitForServer, boolean isRestarting) {
|
||||
@@ -352,7 +352,7 @@ index af17193fde9d4c13e84fb7952521430299f2cfec..5c0e7804555f9b789a96a98008dd1edf
|
||||
this.isRestarting = isRestarting;
|
||||
this.hasLoggedStop = true; // Paper - Debugging
|
||||
if (isDebugging()) io.papermc.paper.util.TraceUtil.dumpTraceForThread("Server stopped"); // Paper - Debugging
|
||||
@@ -1184,6 +1198,16 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -1185,6 +1199,16 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
}
|
||||
// Paper end - Add onboarding message for initial server start
|
||||
|
||||
@@ -369,7 +369,7 @@ index af17193fde9d4c13e84fb7952521430299f2cfec..5c0e7804555f9b789a96a98008dd1edf
|
||||
while (this.running) {
|
||||
long l;
|
||||
if (!this.isPaused() && this.tickRateManager.isSprinting() && this.tickRateManager.checkShouldSprintThisTick()) {
|
||||
@@ -1217,6 +1241,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -1218,6 +1242,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
this.recentTps[0] = tps1.getAverage();
|
||||
this.recentTps[1] = tps5.getAverage();
|
||||
this.recentTps[2] = tps15.getAverage();
|
||||
@@ -377,7 +377,7 @@ index af17193fde9d4c13e84fb7952521430299f2cfec..5c0e7804555f9b789a96a98008dd1edf
|
||||
tickSection = currentTime;
|
||||
}
|
||||
// Paper end - further improve server tick loop
|
||||
@@ -1242,6 +1267,12 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -1243,6 +1268,12 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
this.tickFrame.end();
|
||||
this.mayHaveDelayedTasks = true;
|
||||
this.delayedTasksMaxNextTickTimeNanos = Math.max(Util.getNanos() + l, this.nextTickTimeNanos);
|
||||
@@ -390,7 +390,7 @@ index af17193fde9d4c13e84fb7952521430299f2cfec..5c0e7804555f9b789a96a98008dd1edf
|
||||
this.startMeasuringTaskExecutionTime();
|
||||
this.waitUntilNextTick();
|
||||
this.finishMeasuringTaskExecutionTime();
|
||||
@@ -1657,7 +1688,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -1658,7 +1689,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
long worldTime = level.getGameTime();
|
||||
final ClientboundSetTimePacket worldPacket = new ClientboundSetTimePacket(worldTime, dayTime, doDaylight);
|
||||
for (Player entityhuman : level.players()) {
|
||||
@@ -399,7 +399,7 @@ index af17193fde9d4c13e84fb7952521430299f2cfec..5c0e7804555f9b789a96a98008dd1edf
|
||||
continue;
|
||||
}
|
||||
ServerPlayer entityplayer = (ServerPlayer) entityhuman;
|
||||
@@ -1676,6 +1707,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -1677,6 +1708,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
serverLevel.hasEntityMoveEvent = io.papermc.paper.event.entity.EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper - Add EntityMoveEvent
|
||||
serverLevel.updateLagCompensationTick(); // Paper - lag compensation
|
||||
net.minecraft.world.level.block.entity.HopperBlockEntity.skipHopperEvents = serverLevel.paperConfig().hopper.disableMoveEvent || org.bukkit.event.inventory.InventoryMoveItemEvent.getHandlerList().getRegisteredListeners().length == 0; // Paper - Perf: Optimize Hoppers
|
||||
|
||||
@@ -5,7 +5,7 @@ Subject: [PATCH] Fix Pufferfish and Purpur patches
|
||||
|
||||
|
||||
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
|
||||
index 5c0e7804555f9b789a96a98008dd1edf0be68104..62b82b753c36b5400e371952e0685115453bd953 100644
|
||||
index 271233087ad8a0ef8e90e1d518907e166f8235a2..ecf1e794c78962440da02aadfbe78d9782df2cf0 100644
|
||||
--- a/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/net/minecraft/server/MinecraftServer.java
|
||||
@@ -276,7 +276,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -26,7 +26,7 @@ index 5c0e7804555f9b789a96a98008dd1edf0be68104..62b82b753c36b5400e371952e0685115
|
||||
public boolean lagging = false; // Purpur - Lagging threshold
|
||||
protected boolean upnp = false; // Purpur - UPnP Port Forwarding
|
||||
|
||||
@@ -1238,9 +1238,12 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -1239,9 +1239,12 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
tps15.add(currentTps, diff);
|
||||
|
||||
// Backwards compat with bad plugins
|
||||
@@ -42,7 +42,7 @@ index 5c0e7804555f9b789a96a98008dd1edf0be68104..62b82b753c36b5400e371952e0685115
|
||||
lagging = recentTps[0] < org.purpurmc.purpur.PurpurConfig.laggingThreshold; // Purpur - Lagging threshold
|
||||
tickSection = currentTime;
|
||||
}
|
||||
@@ -1268,7 +1271,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -1269,7 +1272,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
this.mayHaveDelayedTasks = true;
|
||||
this.delayedTasksMaxNextTickTimeNanos = Math.max(Util.getNanos() + l, this.nextTickTimeNanos);
|
||||
// Purpur start - Configurable TPS Catchup
|
||||
|
||||
@@ -7,10 +7,10 @@ Original license: MIT
|
||||
Original project: https://github.com/PurpurMC/Purpur
|
||||
|
||||
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
|
||||
index 62b82b753c36b5400e371952e0685115453bd953..3190ed2171b0de32aeb8761aa3e510c968c45448 100644
|
||||
index ecf1e794c78962440da02aadfbe78d9782df2cf0..cf958bb871137dc88a8c36be867f2192acba2687 100644
|
||||
--- a/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/net/minecraft/server/MinecraftServer.java
|
||||
@@ -1837,7 +1837,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -1838,7 +1838,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
|
||||
@DontObfuscate
|
||||
public String getServerModName() {
|
||||
|
||||
@@ -59,10 +59,10 @@ index 62b9d9486c15a1ec6527f786df4e9fc483390bcb..5384bbc6bb3dbe5481f9d8cb10282551
|
||||
int i = buffer.readableBytes();
|
||||
if (i >= 0 && i <= maxSize) {
|
||||
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
|
||||
index 3190ed2171b0de32aeb8761aa3e510c968c45448..58c52eabba725be9fa5fde06be5cf69d0281ce5b 100644
|
||||
index cf958bb871137dc88a8c36be867f2192acba2687..2c50bde56da7174dcea828feedecb92c98347a45 100644
|
||||
--- a/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/net/minecraft/server/MinecraftServer.java
|
||||
@@ -1735,6 +1735,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -1736,6 +1736,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
GameTestTicker.SINGLETON.tick();
|
||||
}
|
||||
|
||||
|
||||
@@ -87,10 +87,10 @@ index b305ba9bab617bf4e52d0e6ddf160bacc5751a94..853933618e67d7597c23b3099ea7a7a1
|
||||
if (players.size() >= resultLimit) {
|
||||
return players;
|
||||
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
|
||||
index 58c52eabba725be9fa5fde06be5cf69d0281ce5b..83cbf865d83edcb4caea59a1a2b4932a915414be 100644
|
||||
index 2c50bde56da7174dcea828feedecb92c98347a45..ee07832a92b3f73bd85d13388276cf224743c0ed 100644
|
||||
--- a/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/net/minecraft/server/MinecraftServer.java
|
||||
@@ -1638,7 +1638,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -1639,7 +1639,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
}
|
||||
|
||||
private ServerStatus.Players buildPlayerStatus() {
|
||||
|
||||
@@ -13,7 +13,7 @@ To avoid the hefty ArrayDeque's size() call, we check if we *really* need to exe
|
||||
Most entities won't have any scheduled tasks, so this is a nice performance bonus. These optimizations, however, wouldn't work in a Folia environment, but because in SparklyPaper executeTick is always executed on the main thread, it ain't an issue for us (yay).
|
||||
|
||||
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
|
||||
index 83cbf865d83edcb4caea59a1a2b4932a915414be..3a86960729e23c7a5028dd64538d08428afd2b01 100644
|
||||
index ee07832a92b3f73bd85d13388276cf224743c0ed..2ecda6d2af7721113384c11d4a96a3b3cb082232 100644
|
||||
--- a/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/net/minecraft/server/MinecraftServer.java
|
||||
@@ -289,6 +289,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -24,7 +24,7 @@ index 83cbf865d83edcb4caea59a1a2b4932a915414be..3a86960729e23c7a5028dd64538d0842
|
||||
|
||||
public static <S extends MinecraftServer> S spin(Function<Thread, S> threadFunction) {
|
||||
AtomicReference<S> atomicReference = new AtomicReference<>();
|
||||
@@ -1662,6 +1663,22 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -1663,6 +1664,22 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
this.server.getScheduler().mainThreadHeartbeat(); // CraftBukkit
|
||||
// Paper start - Folia scheduler API
|
||||
((io.papermc.paper.threadedregions.scheduler.FoliaGlobalRegionScheduler) org.bukkit.Bukkit.getGlobalRegionScheduler()).tick();
|
||||
@@ -47,7 +47,7 @@ index 83cbf865d83edcb4caea59a1a2b4932a915414be..3a86960729e23c7a5028dd64538d0842
|
||||
getAllLevels().forEach(level -> {
|
||||
for (final net.minecraft.world.entity.Entity entity : level.getEntities().getAll()) {
|
||||
if (entity.isRemoved()) {
|
||||
@@ -1673,6 +1690,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -1674,6 +1691,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -5,10 +5,10 @@ Subject: [PATCH] Virtual thread for chat executor
|
||||
|
||||
|
||||
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
|
||||
index 3a86960729e23c7a5028dd64538d08428afd2b01..3ca7405318a4076000250203be4b91dbde95191b 100644
|
||||
index 2ecda6d2af7721113384c11d4a96a3b3cb082232..7f6dac89c98132645799b7976b972bf43f475fe8 100644
|
||||
--- a/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/net/minecraft/server/MinecraftServer.java
|
||||
@@ -2662,7 +2662,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -2663,7 +2663,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
}
|
||||
|
||||
public final java.util.concurrent.ExecutorService chatExecutor = java.util.concurrent.Executors.newCachedThreadPool(
|
||||
|
||||
@@ -5,10 +5,10 @@ Subject: [PATCH] Cache player profileResult
|
||||
|
||||
|
||||
diff --git a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
||||
index 9dce1d22c7de3a3dd0e0e8f117cfbb54d1b15042..405b62c082017024abae7ccc1db5f74caab1eabf 100644
|
||||
index 9dce1d22c7de3a3dd0e0e8f117cfbb54d1b15042..6b0b0ccc18a5da05685867656705e1fcf94b5891 100644
|
||||
--- a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
||||
+++ b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
||||
@@ -70,6 +70,11 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
|
||||
@@ -70,6 +70,14 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
|
||||
private net.minecraft.server.level.ServerPlayer player; // CraftBukkit
|
||||
public boolean iKnowThisMayNotBeTheBestIdeaButPleaseDisableUsernameValidation = false; // Paper - username validation overriding
|
||||
private int velocityLoginMessageId = -1; // Paper - Add Velocity IP Forwarding Support
|
||||
@@ -16,11 +16,14 @@ index 9dce1d22c7de3a3dd0e0e8f117cfbb54d1b15042..405b62c082017024abae7ccc1db5f74c
|
||||
+ private static final com.github.benmanes.caffeine.cache.Cache<String, ProfileResult> playerProfileResultCache = com.github.benmanes.caffeine.cache.Caffeine.newBuilder()
|
||||
+ .expireAfterWrite(org.dreeam.leaf.config.modules.misc.Cache.cachePlayerProfileResultTimeout, java.util.concurrent.TimeUnit.MINUTES)
|
||||
+ .build();
|
||||
+ private static final com.github.benmanes.caffeine.cache.Cache<String, InetAddress> playerSession = com.github.benmanes.caffeine.cache.Caffeine.newBuilder()
|
||||
+ .expireAfterWrite(org.dreeam.leaf.config.modules.misc.Cache.cachePlayerProfileResultTimeout, java.util.concurrent.TimeUnit.MINUTES)
|
||||
+ .build();
|
||||
+ // Leaf end - Cache player profileResult
|
||||
|
||||
public ServerLoginPacketListenerImpl(MinecraftServer server, Connection connection, boolean transferred) {
|
||||
this.server = server;
|
||||
@@ -303,9 +308,25 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
|
||||
@@ -303,9 +311,30 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
|
||||
String string1 = Objects.requireNonNull(ServerLoginPacketListenerImpl.this.requestedUsername, "Player name not initialized");
|
||||
|
||||
try {
|
||||
@@ -29,15 +32,20 @@ index 9dce1d22c7de3a3dd0e0e8f117cfbb54d1b15042..405b62c082017024abae7ccc1db5f74c
|
||||
- .hasJoinedServer(string1, string, this.getAddress());
|
||||
+ // Leaf start - Cache player profileResult
|
||||
+ ProfileResult profileResult;
|
||||
+ if (false) { // TODO
|
||||
+ if (org.dreeam.leaf.config.modules.misc.Cache.cachePlayerProfileResult) {
|
||||
+ profileResult = playerProfileResultCache.getIfPresent(string1);
|
||||
+
|
||||
+ if (profileResult == null) {
|
||||
+ InetAddress address = this.getAddress();
|
||||
+ InetAddress lastAddress = playerSession.getIfPresent(string1);
|
||||
+ if (isInvalidSession(address, lastAddress)) {
|
||||
+ // Send request to mojang server to verify session
|
||||
+ // Result will be null if is invalid and will do disconnect logic below
|
||||
+ profileResult = ServerLoginPacketListenerImpl.this.server
|
||||
+ .getSessionService()
|
||||
+ .hasJoinedServer(string1, string, this.getAddress());
|
||||
+ if (profileResult != null) {
|
||||
+ .hasJoinedServer(string1, string, address);
|
||||
+ if (profileResult != null && address != null) {
|
||||
+ playerProfileResultCache.put(string1, profileResult);
|
||||
+ playerSession.put(string1, address);
|
||||
+ }
|
||||
+ }
|
||||
+ } else {
|
||||
@@ -49,3 +57,24 @@ index 9dce1d22c7de3a3dd0e0e8f117cfbb54d1b15042..405b62c082017024abae7ccc1db5f74c
|
||||
if (profileResult != null) {
|
||||
GameProfile gameProfile = profileResult.profile();
|
||||
// CraftBukkit start - fire PlayerPreLoginEvent
|
||||
@@ -350,6 +379,20 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
|
||||
// Paper end - Cache authenticator threads
|
||||
}
|
||||
|
||||
+ // Leaf start - Cache player profileResult
|
||||
+ private static boolean isInvalidSession(@org.jetbrains.annotations.Nullable InetAddress currAddress, @org.jetbrains.annotations.Nullable InetAddress lastAddress) {
|
||||
+ // Invalid address or non-public IP address
|
||||
+ if (currAddress == null ||
|
||||
+ currAddress.isAnyLocalAddress() ||
|
||||
+ currAddress.isLinkLocalAddress() ||
|
||||
+ currAddress.isLoopbackAddress() ||
|
||||
+ currAddress.isSiteLocalAddress()) {
|
||||
+ return true;
|
||||
+ }
|
||||
+ return !currAddress.equals(lastAddress);
|
||||
+ }
|
||||
+ // Leaf end - Cache player profileResult
|
||||
+
|
||||
// CraftBukkit start
|
||||
private GameProfile callPlayerPreLoginEvents(GameProfile gameprofile) throws Exception { // Paper - Add more fields to AsyncPlayerPreLoginEvent
|
||||
// Paper start - Add Velocity IP Forwarding Support
|
||||
|
||||
@@ -5,7 +5,7 @@ Subject: [PATCH] Replace brain maps with optimized collection
|
||||
|
||||
|
||||
diff --git a/net/minecraft/world/entity/ai/Brain.java b/net/minecraft/world/entity/ai/Brain.java
|
||||
index 29fdf94db0308031edfe7915fc587a2aa5a1a18a..b946faf899561b9e4f8399e16600eede54bb55a5 100644
|
||||
index 29fdf94db0308031edfe7915fc587a2aa5a1a18a..4a0faaedacd7b925c5adad0280870e674cf7ab46 100644
|
||||
--- a/net/minecraft/world/entity/ai/Brain.java
|
||||
+++ b/net/minecraft/world/entity/ai/Brain.java
|
||||
@@ -45,14 +45,18 @@ public class Brain<E extends LivingEntity> {
|
||||
@@ -14,11 +14,12 @@ index 29fdf94db0308031edfe7915fc587a2aa5a1a18a..b946faf899561b9e4f8399e16600eede
|
||||
private static final int SCHEDULE_UPDATE_DELAY = 20;
|
||||
- private final Map<MemoryModuleType<?>, Optional<? extends ExpirableValue<?>>> memories = Maps.newHashMap();
|
||||
- private final Map<SensorType<? extends Sensor<? super E>>, Sensor<? super E>> sensors = Maps.newLinkedHashMap();
|
||||
- private final Map<Integer, Map<Activity, Set<BehaviorControl<? super E>>>> availableBehaviorsByPriority = Maps.newTreeMap();
|
||||
+ // Leaf start - Replace brain maps with optimized collection
|
||||
+ private final Map<MemoryModuleType<?>, Optional<? extends ExpirableValue<?>>> memories = new it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap<>();
|
||||
+ private final Map<SensorType<? extends Sensor<? super E>>, Sensor<? super E>> sensors = new it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap<>();
|
||||
+ private final Map<MemoryModuleType<?>, Optional<? extends ExpirableValue<?>>> memories = new it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap<>();
|
||||
+ private final Map<SensorType<? extends Sensor<? super E>>, Sensor<? super E>> sensors = new it.unimi.dsi.fastutil.objects.Reference2ReferenceLinkedOpenHashMap<>();
|
||||
+ private final Map<Integer, Map<Activity, Set<BehaviorControl<? super E>>>> availableBehaviorsByPriority = new it.unimi.dsi.fastutil.objects.Object2ObjectRBTreeMap<>();
|
||||
+ // Leaf end - Replace brain maps with optimized collection
|
||||
private final Map<Integer, Map<Activity, Set<BehaviorControl<? super E>>>> availableBehaviorsByPriority = Maps.newTreeMap();
|
||||
private Schedule schedule = Schedule.EMPTY;
|
||||
- private final Map<Activity, Set<Pair<MemoryModuleType<?>, MemoryStatus>>> activityRequirements = Maps.newHashMap();
|
||||
- private final Map<Activity, Set<MemoryModuleType<?>>> activityMemoriesToEraseWhenStopped = Maps.newHashMap();
|
||||
|
||||
@@ -71,7 +71,7 @@ index 9c0c99b936b4a82ebfe924866e53ec71f7bbe9ad..2ccff968cb2065d34fad4d27573f9e30
|
||||
.add(
|
||||
new ClientboundUpdateAttributesPacket.AttributeSnapshot(
|
||||
diff --git a/net/minecraft/server/level/ChunkMap.java b/net/minecraft/server/level/ChunkMap.java
|
||||
index c60b9e4076450de2157c1a3cf4f98cc2c19e4e6a..ae0a7c9b95f4f2561769e0d661fadbe29a2d6f8b 100644
|
||||
index c60b9e4076450de2157c1a3cf4f98cc2c19e4e6a..38a43e143906f2727025696a2895eafa8a77deb6 100644
|
||||
--- a/net/minecraft/server/level/ChunkMap.java
|
||||
+++ b/net/minecraft/server/level/ChunkMap.java
|
||||
@@ -255,6 +255,15 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
@@ -104,26 +104,51 @@ index c60b9e4076450de2157c1a3cf4f98cc2c19e4e6a..ae0a7c9b95f4f2561769e0d661fadbe2
|
||||
// Paper start - optimise entity tracker
|
||||
if (true) {
|
||||
this.newTrackerTick();
|
||||
@@ -1135,7 +1151,17 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
@@ -1135,7 +1151,42 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
final Entity entity;
|
||||
private final int range;
|
||||
SectionPos lastSectionPos;
|
||||
- public final Set<ServerPlayerConnection> seenBy = new it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet<>(); // Paper - Perf: optimise map impl
|
||||
+ // Leaf start - Multithreaded tracker
|
||||
+ public static final ServerPlayerConnection[] EMPTY_OBJECT_ARRAY = new ServerPlayerConnection[0];
|
||||
+ public final Set<ServerPlayerConnection> seenBy = org.dreeam.leaf.config.modules.async.MultithreadedTracker.enabled ? it.unimi.dsi.fastutil.objects.ReferenceSets.synchronize(new it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet<>()) : new it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet<>(); // Paper - Perf: optimise map impl
|
||||
+ private final it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet<ServerPlayerConnection> nonSyncSeenBy = new it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet<>() {
|
||||
+ @Override
|
||||
+ public boolean add(ServerPlayerConnection serverPlayerConnection) {
|
||||
+ seenByUpdated = true;
|
||||
+ return super.add(serverPlayerConnection);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean remove(Object k) {
|
||||
+ seenByUpdated = true;
|
||||
+ return super.remove(k);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void clear() {
|
||||
+ seenByUpdated = true;
|
||||
+ super.clear();
|
||||
+ }
|
||||
+ };
|
||||
+ public final Set<ServerPlayerConnection> seenBy = org.dreeam.leaf.config.modules.async.MultithreadedTracker.enabled ? it.unimi.dsi.fastutil.objects.ReferenceSets.synchronize(nonSyncSeenBy) : nonSyncSeenBy; // Paper - Perf: optimise map impl
|
||||
+ private volatile boolean seenByUpdated = true;
|
||||
+ private volatile ServerPlayerConnection[] seenByArray = EMPTY_OBJECT_ARRAY;
|
||||
+ public ServerPlayerConnection[] seenBy() {
|
||||
+ return seenByArray;
|
||||
+ if (!seenByUpdated) {
|
||||
+ return seenByArray;
|
||||
+ } else {
|
||||
+ return seenBy.toArray(EMPTY_OBJECT_ARRAY);
|
||||
+ }
|
||||
+ }
|
||||
+ public void seenByUpdated() {
|
||||
+ this.seenByArray = this.seenBy.toArray(EMPTY_OBJECT_ARRAY);
|
||||
+ seenByUpdated = false;
|
||||
+ }
|
||||
+ // Leaf end - Multithreaded tracker
|
||||
|
||||
// Paper start - optimise entity tracker
|
||||
private long lastChunkUpdate = -1L;
|
||||
@@ -1162,27 +1188,95 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
@@ -1162,27 +1213,95 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
this.lastTrackedChunk = chunk;
|
||||
|
||||
final ServerPlayer[] playersRaw = players.getRawDataUnchecked();
|
||||
@@ -145,13 +170,13 @@ index c60b9e4076450de2157c1a3cf4f98cc2c19e4e6a..ae0a7c9b95f4f2561769e0d661fadbe2
|
||||
if (!players.contains(player)) {
|
||||
- this.removePlayer(player);
|
||||
+ removed |= this.removePlayerMulti(player);
|
||||
}
|
||||
}
|
||||
+ }
|
||||
+ }
|
||||
+ if (removed) {
|
||||
+ this.seenByUpdated();
|
||||
+ }
|
||||
}
|
||||
}
|
||||
+ }
|
||||
+ }
|
||||
+ // Leaf end - Multithreaded tracker
|
||||
+
|
||||
+ // Leaf start - Multithreaded tracker
|
||||
@@ -199,8 +224,8 @@ index c60b9e4076450de2157c1a3cf4f98cc2c19e4e6a..ae0a7c9b95f4f2561769e0d661fadbe2
|
||||
+ }
|
||||
+ if (removed) {
|
||||
+ this.seenByUpdated();
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
}
|
||||
+ };
|
||||
+
|
||||
+ // Only update asynchronously for real player, and sync update for fake players
|
||||
@@ -212,8 +237,8 @@ index c60b9e4076450de2157c1a3cf4f98cc2c19e4e6a..ae0a7c9b95f4f2561769e0d661fadbe2
|
||||
+ } else {
|
||||
+ updatePlayerTasks.run();
|
||||
+ return null;
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
}
|
||||
+ // Leaf end - Multithreaded tracker
|
||||
|
||||
@Override
|
||||
@@ -224,7 +249,7 @@ index c60b9e4076450de2157c1a3cf4f98cc2c19e4e6a..ae0a7c9b95f4f2561769e0d661fadbe2
|
||||
if (!ca.spottedleaf.moonrise.common.util.TickThread.isTickThreadFor(conn.getPlayer())) {
|
||||
foundToRemove = true;
|
||||
break;
|
||||
@@ -1193,12 +1287,13 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
@@ -1193,12 +1312,13 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -240,7 +265,7 @@ index c60b9e4076450de2157c1a3cf4f98cc2c19e4e6a..ae0a7c9b95f4f2561769e0d661fadbe2
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1208,10 +1303,11 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
@@ -1208,10 +1328,11 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
if (this.seenBy.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
@@ -254,7 +279,7 @@ index c60b9e4076450de2157c1a3cf4f98cc2c19e4e6a..ae0a7c9b95f4f2561769e0d661fadbe2
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1238,7 +1334,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
@@ -1238,7 +1359,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
}
|
||||
|
||||
public void broadcast(Packet<?> packet) {
|
||||
@@ -263,7 +288,7 @@ index c60b9e4076450de2157c1a3cf4f98cc2c19e4e6a..ae0a7c9b95f4f2561769e0d661fadbe2
|
||||
serverPlayerConnection.send(packet);
|
||||
}
|
||||
}
|
||||
@@ -1259,21 +1355,34 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
@@ -1259,21 +1380,34 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
}
|
||||
|
||||
public void broadcastRemoved() {
|
||||
@@ -301,7 +326,7 @@ index c60b9e4076450de2157c1a3cf4f98cc2c19e4e6a..ae0a7c9b95f4f2561769e0d661fadbe2
|
||||
// Paper start - remove allocation of Vec3D here
|
||||
// Vec3 vec3 = player.position().subtract(this.entity.position());
|
||||
double vec3_dx = player.getX() - this.entity.getX();
|
||||
@@ -1301,6 +1410,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
@@ -1301,6 +1435,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
// CraftBukkit end
|
||||
if (flag) {
|
||||
if (this.seenBy.add(player.connection)) {
|
||||
@@ -309,7 +334,7 @@ index c60b9e4076450de2157c1a3cf4f98cc2c19e4e6a..ae0a7c9b95f4f2561769e0d661fadbe2
|
||||
// Paper start - entity tracking events
|
||||
if (io.papermc.paper.event.player.PlayerTrackEntityEvent.getHandlerList().getRegisteredListeners().length == 0 || new io.papermc.paper.event.player.PlayerTrackEntityEvent(player.getBukkitEntity(), this.entity.getBukkitEntity()).callEvent()) {
|
||||
this.serverEntity.addPairing(player);
|
||||
@@ -1309,6 +1419,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
@@ -1309,6 +1444,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
this.serverEntity.onPlayerAdd(); // Paper - fix desync when a player is added to the tracker
|
||||
}
|
||||
} else if (this.seenBy.remove(player.connection)) {
|
||||
|
||||
@@ -6,23 +6,6 @@ Subject: [PATCH] Nitori: Async playerdata saving
|
||||
Original license: GPL v3
|
||||
Original project: https://github.com/Gensokyo-Reimagined/Nitori
|
||||
|
||||
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
|
||||
index 3ca7405318a4076000250203be4b91dbde95191b..2aed6f594c73bea5e8919e65cf04bc7eb6775c3e 100644
|
||||
--- a/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/net/minecraft/server/MinecraftServer.java
|
||||
@@ -1067,6 +1067,12 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
io.papermc.paper.log.CustomLogManager.forceReset(); // Paper - Reset loggers after shutdown
|
||||
this.onServerExit();
|
||||
// Paper end - Improved watchdog support - move final shutdown items here
|
||||
+ // Leaf start - Async playerdata saving
|
||||
+ org.dreeam.leaf.async.AsyncPlayerDataSaving.IO_POOL.shutdown();
|
||||
+ try {
|
||||
+ org.dreeam.leaf.async.AsyncPlayerDataSaving.IO_POOL.awaitTermination(30, java.util.concurrent.TimeUnit.SECONDS);
|
||||
+ } catch (java.lang.InterruptedException ignored) {}
|
||||
+ // Leaf end - Async playerdata saving
|
||||
}
|
||||
|
||||
public String getLocalIp() {
|
||||
diff --git a/net/minecraft/world/level/storage/LevelStorageSource.java b/net/minecraft/world/level/storage/LevelStorageSource.java
|
||||
index 8104f71c30c1fa46c83acdf0b2e58483df9d89cc..169b4544ab3d0e8515a2d7020a23ae0e2e0c952d 100644
|
||||
--- a/net/minecraft/world/level/storage/LevelStorageSource.java
|
||||
|
||||
@@ -7,10 +7,10 @@ Original license: AGPL-3.0
|
||||
Original project: https://github.com/snackbag/TT20
|
||||
|
||||
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
|
||||
index 2aed6f594c73bea5e8919e65cf04bc7eb6775c3e..bbd2b327c658b56a1fcf30c8b77cab987d688fcc 100644
|
||||
index 7f6dac89c98132645799b7976b972bf43f475fe8..4bf840705bec251aa7e5595fa16bf8e1a9a7d2e9 100644
|
||||
--- a/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/net/minecraft/server/MinecraftServer.java
|
||||
@@ -1544,6 +1544,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -1539,6 +1539,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
|
||||
this.server.spark.tickStart(); // Paper - spark
|
||||
new com.destroystokyo.paper.event.server.ServerTickStartEvent(this.tickCount+1).callEvent(); // Paper - Server Tick Events
|
||||
|
||||
@@ -5,7 +5,7 @@ Subject: [PATCH] Optimize checking nearby players for spawning
|
||||
|
||||
|
||||
diff --git a/net/minecraft/server/level/ChunkMap.java b/net/minecraft/server/level/ChunkMap.java
|
||||
index ae0a7c9b95f4f2561769e0d661fadbe29a2d6f8b..14b2abc51fa5d2caa56adfaf50784296c5668ae6 100644
|
||||
index 38a43e143906f2727025696a2895eafa8a77deb6..083b49c8fbdbde96b5be3e5531c21b2c96371b60 100644
|
||||
--- a/net/minecraft/server/level/ChunkMap.java
|
||||
+++ b/net/minecraft/server/level/ChunkMap.java
|
||||
@@ -773,7 +773,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
@@ -5,7 +5,7 @@ Subject: [PATCH] Replace brain activity maps with optimized collection
|
||||
|
||||
|
||||
diff --git a/net/minecraft/world/entity/ai/Brain.java b/net/minecraft/world/entity/ai/Brain.java
|
||||
index b2e17d387558875f45a8458cf874a5b056820432..e78cef4c0ee6cff7ec2f27ced12c96be67dc7a0e 100644
|
||||
index 4a0faaedacd7b925c5adad0280870e674cf7ab46..655c3028440e62bcc01d8f1b3e808fd68484128e 100644
|
||||
--- a/net/minecraft/world/entity/ai/Brain.java
|
||||
+++ b/net/minecraft/world/entity/ai/Brain.java
|
||||
@@ -399,8 +399,8 @@ public class Brain<E extends LivingEntity> {
|
||||
@@ -38,10 +38,10 @@ index ccd6f16e244745ee0702504dbea710485037a3e3..2ecb73fc7b6754ade93bf16b48c623e6
|
||||
.forEach(
|
||||
entity -> {
|
||||
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
|
||||
index e97a93c97e1822f969dce2d30dd915db5d3d14cf..ccd442b24693bc9269cc8ab3e44887d0ad3eadbd 100644
|
||||
index 18125ed336c3425f123232b405a8af9ee3a2ba7d..d507544efafe74ecaffd6a063eff152d349ec76a 100644
|
||||
--- a/net/minecraft/server/level/ServerPlayer.java
|
||||
+++ b/net/minecraft/server/level/ServerPlayer.java
|
||||
@@ -1519,6 +1519,13 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||
@@ -1518,6 +1518,13 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||
this.containerMenu.broadcastChanges();
|
||||
}
|
||||
|
||||
@@ -20,10 +20,10 @@ One-time operation: Convert distance to squared distance
|
||||
Total operations: ~3 × n (in the no-predicate case) or ~4 × n (with predicate)
|
||||
|
||||
diff --git a/net/minecraft/world/level/EntityGetter.java b/net/minecraft/world/level/EntityGetter.java
|
||||
index 670860df81a3abfc1b8b53be505fce0ee32ee2c4..083a2b5da246113913bcd5d0b2b9be42cf0554d9 100644
|
||||
index 670860df81a3abfc1b8b53be505fce0ee32ee2c4..308e00947da3fe4888fb1b1b9fa11ac5da46663b 100644
|
||||
--- a/net/minecraft/world/level/EntityGetter.java
|
||||
+++ b/net/minecraft/world/level/EntityGetter.java
|
||||
@@ -201,23 +201,42 @@ public interface EntityGetter extends ca.spottedleaf.moonrise.patches.chunk_syst
|
||||
@@ -201,23 +201,43 @@ public interface EntityGetter extends ca.spottedleaf.moonrise.patches.chunk_syst
|
||||
}
|
||||
// Paper end - Affects Spawning API
|
||||
|
||||
@@ -41,9 +41,10 @@ index 670860df81a3abfc1b8b53be505fce0ee32ee2c4..083a2b5da246113913bcd5d0b2b9be42
|
||||
|
||||
- for (Player player1 : this.players()) {
|
||||
- if (predicate == null || predicate.test(player1)) {
|
||||
+ List<? extends Player> players = this.players();
|
||||
+ if (predicate == null) {
|
||||
+ for (int i = 0; i < this.players().size(); i++) {
|
||||
+ Player player1 = this.players().get(i);
|
||||
+ for (int i = 0, playersSize = players.size(); i < playersSize; i++) {
|
||||
+ Player player1 = players.get(i);
|
||||
double d1 = player1.distanceToSqr(x, y, z);
|
||||
- if ((distance < 0.0 || d1 < distance * distance) && (d == -1.0 || d1 < d)) {
|
||||
- d = d1;
|
||||
@@ -53,8 +54,8 @@ index 670860df81a3abfc1b8b53be505fce0ee32ee2c4..083a2b5da246113913bcd5d0b2b9be42
|
||||
}
|
||||
}
|
||||
+ } else {
|
||||
+ for (int i = 0; i < this.players().size(); i++) {
|
||||
+ Player player1 = this.players().get(i);
|
||||
+ for (int i = 0, playersSize = players.size(); i < playersSize; i++) {
|
||||
+ Player player1 = players.get(i);
|
||||
+ if (predicate.test(player1)) {
|
||||
+ double d1 = player1.distanceToSqr(x, y, z);
|
||||
+ if (d1 < distance) {
|
||||
@@ -1,72 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Taiyou06 <kaandindar21@gmail.com>
|
||||
Date: Fri, 14 Feb 2025 14:58:59 +0100
|
||||
Subject: [PATCH] Alternative Brain Behaviour
|
||||
|
||||
In the test, this can give ~54.87% improvement (~25712ms -> ~11604ms),
|
||||
under 1024 villagers situation.
|
||||
|
||||
diff --git a/net/minecraft/world/entity/ai/Brain.java b/net/minecraft/world/entity/ai/Brain.java
|
||||
index e78cef4c0ee6cff7ec2f27ced12c96be67dc7a0e..e3d0186e681168840836690acd402b774bc464b5 100644
|
||||
--- a/net/minecraft/world/entity/ai/Brain.java
|
||||
+++ b/net/minecraft/world/entity/ai/Brain.java
|
||||
@@ -268,23 +268,52 @@ public class Brain<E extends LivingEntity> {
|
||||
return this.activeActivities;
|
||||
}
|
||||
|
||||
+ // Leaf start - Alternative Brain Behaviour
|
||||
+ private ObjectArrayList<BehaviorControl<? super E>> runningBehaviorsCache;
|
||||
+ private long lastRunningBehaviorCheck = -1;
|
||||
+ // Leaf end - Alternative Brain Behaviour
|
||||
+
|
||||
@Deprecated
|
||||
@VisibleForDebug
|
||||
public List<BehaviorControl<? super E>> getRunningBehaviors() {
|
||||
- List<BehaviorControl<? super E>> list = new ObjectArrayList<>();
|
||||
+ // Leaf start - Alternative Brain Behaviour
|
||||
+ long currentTick = getCurrentTick();
|
||||
+
|
||||
+ // Use cached result if within update interval
|
||||
+ if (runningBehaviorsCache != null && (currentTick - lastRunningBehaviorCheck) < org.dreeam.leaf.config.modules.opt.BrainRunningBehaviorCacheUpdate.interval) {
|
||||
+ return runningBehaviorsCache;
|
||||
+ }
|
||||
+
|
||||
+ // Initialize or reuse cache list
|
||||
+ if (runningBehaviorsCache == null) {
|
||||
+ runningBehaviorsCache = new ObjectArrayList<>(32);
|
||||
+ } else {
|
||||
+ runningBehaviorsCache.clear();
|
||||
+ }
|
||||
+
|
||||
+ for (Map<Activity, Set<BehaviorControl<? super E>>> activityMap : availableBehaviorsByPriority.values()) {
|
||||
+ for (Set<BehaviorControl<? super E>> behaviors : activityMap.values()) {
|
||||
+ if (behaviors.isEmpty()) continue;
|
||||
|
||||
- for (Map<Activity, Set<BehaviorControl<? super E>>> map : this.availableBehaviorsByPriority.values()) {
|
||||
- for (Set<BehaviorControl<? super E>> set : map.values()) {
|
||||
- for (BehaviorControl<? super E> behaviorControl : set) {
|
||||
- if (behaviorControl.getStatus() == Behavior.Status.RUNNING) {
|
||||
- list.add(behaviorControl);
|
||||
+ for (BehaviorControl<? super E> behavior : behaviors) {
|
||||
+ if (behavior.getStatus() == Behavior.Status.RUNNING) {
|
||||
+ runningBehaviorsCache.add(behavior);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- return list;
|
||||
+ lastRunningBehaviorCheck = currentTick;
|
||||
+
|
||||
+ return runningBehaviorsCache;
|
||||
+ }
|
||||
+
|
||||
+ // Helper method to get current tick
|
||||
+ private long getCurrentTick() {
|
||||
+ // This should be implemented to return the current game tick
|
||||
+ return System.nanoTime() / 50_000_000; // Approximate tick time of 50ms
|
||||
}
|
||||
+ // Leaf end - Alternative Brain Behaviour
|
||||
|
||||
public void useDefaultActivity() {
|
||||
this.setActiveActivity(this.defaultActivity);
|
||||
@@ -6,7 +6,7 @@ Subject: [PATCH] Use ensureCapacity to pre-populate the size of ticking chunks
|
||||
|
||||
|
||||
diff --git a/net/minecraft/server/level/ChunkMap.java b/net/minecraft/server/level/ChunkMap.java
|
||||
index 14b2abc51fa5d2caa56adfaf50784296c5668ae6..0813505f96a1a6bb2cbfb05a97c90241f0c5b1c8 100644
|
||||
index 083b49c8fbdbde96b5be3e5531c21b2c96371b60..d77197ff56bd7acd7747af7d0dc937c31fa86a17 100644
|
||||
--- a/net/minecraft/server/level/ChunkMap.java
|
||||
+++ b/net/minecraft/server/level/ChunkMap.java
|
||||
@@ -733,6 +733,11 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
@@ -7,7 +7,7 @@ Subject: [PATCH] Directly use the pre-filtered ticking chunks list as the
|
||||
This patch uses already pre filtered chunks, which completely skips the isChunkNearPlayer check
|
||||
|
||||
diff --git a/net/minecraft/server/level/ChunkMap.java b/net/minecraft/server/level/ChunkMap.java
|
||||
index 0813505f96a1a6bb2cbfb05a97c90241f0c5b1c8..051d839fece06cac8ad79d8d936237a66cd01ae4 100644
|
||||
index d77197ff56bd7acd7747af7d0dc937c31fa86a17..b0a5ded4012e892631f20829166e86fac8491339 100644
|
||||
--- a/net/minecraft/server/level/ChunkMap.java
|
||||
+++ b/net/minecraft/server/level/ChunkMap.java
|
||||
@@ -739,13 +739,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
@@ -41,6 +41,29 @@ index ea4010df54dbd17cdae22d671ea1e4bd7b685b3e..8d53cb917e9f623a67aba066c6a21f27
|
||||
|
||||
boolean ret = false;
|
||||
final boolean canProcessFullUpdates = processFullUpdates & isTickThread;
|
||||
diff --git a/io/papermc/paper/redstone/RedstoneWireTurbo.java b/io/papermc/paper/redstone/RedstoneWireTurbo.java
|
||||
index ff747a1ecdf3c888bca0d69de4f85dcd810b6139..b288d57d9f7bd0ccf1877cf9920bd67288ff22f7 100644
|
||||
--- a/io/papermc/paper/redstone/RedstoneWireTurbo.java
|
||||
+++ b/io/papermc/paper/redstone/RedstoneWireTurbo.java
|
||||
@@ -829,14 +829,10 @@ public final class RedstoneWireTurbo {
|
||||
j = getMaxCurrentStrength(upd, j);
|
||||
int l = 0;
|
||||
|
||||
- wire.shouldSignal = false;
|
||||
- // Unfortunately, World.isBlockIndirectlyGettingPowered is complicated,
|
||||
- // and I'm not ready to try to replicate even more functionality from
|
||||
- // elsewhere in Minecraft into this accelerator. So sadly, we must
|
||||
- // suffer the performance hit of this very expensive call. If there
|
||||
- // is consistency to what this call returns, we may be able to cache it.
|
||||
- final int k = worldIn.getBestNeighborSignal(upd.self);
|
||||
- wire.shouldSignal = true;
|
||||
+ // Leaf start - SparklyPaper - parallel world ticking
|
||||
+ // This now correctly calls the (conditionally) thread-safe method in RedStoneWireBlock
|
||||
+ final int k = wire.getBlockSignal(worldIn, upd.self);
|
||||
+ // Leaf end - SparklyPaper - parallel world ticking
|
||||
|
||||
// The variable 'k' holds the maximum redstone power value of any adjacent blocks.
|
||||
// If 'k' has the highest level of all neighbors, then the power level of this
|
||||
diff --git a/net/minecraft/core/dispenser/DispenseItemBehavior.java b/net/minecraft/core/dispenser/DispenseItemBehavior.java
|
||||
index 582e012222123e5001c34153f2ee1ab1d08935fd..c0bce2293d07ca58cc5bc9e036ab8dcac06c1566 100644
|
||||
--- a/net/minecraft/core/dispenser/DispenseItemBehavior.java
|
||||
@@ -57,7 +80,7 @@ index 582e012222123e5001c34153f2ee1ab1d08935fd..c0bce2293d07ca58cc5bc9e036ab8dca
|
||||
List<org.bukkit.block.BlockState> states = new java.util.ArrayList<>(level.capturedBlockStates.values());
|
||||
level.capturedBlockStates.clear();
|
||||
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
|
||||
index bbd2b327c658b56a1fcf30c8b77cab987d688fcc..c9b8bc9592d5fce77750de89fa886db383d92a89 100644
|
||||
index 4bf840705bec251aa7e5595fa16bf8e1a9a7d2e9..543bdb926426bfd5be01d0c23e8c9e274b94485c 100644
|
||||
--- a/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/net/minecraft/server/MinecraftServer.java
|
||||
@@ -290,6 +290,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -131,7 +154,7 @@ index bbd2b327c658b56a1fcf30c8b77cab987d688fcc..c9b8bc9592d5fce77750de89fa886db3
|
||||
flag = true;
|
||||
}
|
||||
|
||||
@@ -1665,6 +1684,18 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -1660,6 +1679,18 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
}
|
||||
}
|
||||
|
||||
@@ -150,7 +173,7 @@ index bbd2b327c658b56a1fcf30c8b77cab987d688fcc..c9b8bc9592d5fce77750de89fa886db3
|
||||
protected void tickChildren(BooleanSupplier hasTimeLeft) {
|
||||
this.getPlayerList().getPlayers().forEach(serverPlayer1 -> serverPlayer1.connection.suspendFlushing());
|
||||
this.server.getScheduler().mainThreadHeartbeat(); // CraftBukkit
|
||||
@@ -1731,28 +1762,50 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -1726,28 +1757,50 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
}
|
||||
|
||||
this.isIteratingOverLevels = true; // Paper - Throw exception on world create while being ticked
|
||||
@@ -219,7 +242,7 @@ index bbd2b327c658b56a1fcf30c8b77cab987d688fcc..c9b8bc9592d5fce77750de89fa886db3
|
||||
this.isIteratingOverLevels = false; // Paper - Throw exception on world create while being ticked
|
||||
|
||||
this.tickConnection();
|
||||
@@ -1832,6 +1885,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -1827,6 +1880,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
Map<ResourceKey<Level>, ServerLevel> oldLevels = this.levels;
|
||||
Map<ResourceKey<Level>, ServerLevel> newLevels = Maps.newLinkedHashMap(oldLevels);
|
||||
newLevels.remove(level.dimension());
|
||||
@@ -373,7 +396,7 @@ index 54910c2e1d6e6bb556e536fda060bd09402e04e8..72e871b8c7fee9b5cbd567e03baee80e
|
||||
|
||||
// Gale start - Pufferfish - SIMD support
|
||||
diff --git a/net/minecraft/server/level/ServerChunkCache.java b/net/minecraft/server/level/ServerChunkCache.java
|
||||
index 0f9d18dd29e210ad656da211a3cb1cb25cd4efb1..b3acfc7e00797ea16cc2c1793452f3ed97b9c61a 100644
|
||||
index 6d5a15122079f2d1568ceb7086db21ad454f58e6..9dd6205e1cdd2124ab9d91f0a1e344eb6aa1fb2e 100644
|
||||
--- a/net/minecraft/server/level/ServerChunkCache.java
|
||||
+++ b/net/minecraft/server/level/ServerChunkCache.java
|
||||
@@ -175,7 +175,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
|
||||
@@ -617,7 +640,7 @@ index 2ecb73fc7b6754ade93bf16b48c623e6b3a955a9..85bfc91ff163a2a564b7b610e27ff90e
|
||||
// Paper start - extra debug info
|
||||
if (entity.valid) {
|
||||
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
|
||||
index ccd442b24693bc9269cc8ab3e44887d0ad3eadbd..ac7ac519ecc58a31c4b9efc24f054ec014851fb4 100644
|
||||
index d507544efafe74ecaffd6a063eff152d349ec76a..bc955da0dff79262dace84d255f27b3271a91ca5 100644
|
||||
--- a/net/minecraft/server/level/ServerPlayer.java
|
||||
+++ b/net/minecraft/server/level/ServerPlayer.java
|
||||
@@ -456,6 +456,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||
@@ -645,7 +668,7 @@ index ccd442b24693bc9269cc8ab3e44887d0ad3eadbd..ac7ac519ecc58a31c4b9efc24f054ec0
|
||||
// CraftBukkit start
|
||||
/*
|
||||
this.isChangingDimension = true;
|
||||
@@ -1748,6 +1752,12 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||
@@ -1747,6 +1751,12 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||
return OptionalInt.empty();
|
||||
} else {
|
||||
// CraftBukkit start
|
||||
@@ -658,7 +681,7 @@ index ccd442b24693bc9269cc8ab3e44887d0ad3eadbd..ac7ac519ecc58a31c4b9efc24f054ec0
|
||||
this.containerMenu = abstractContainerMenu; // Moved up
|
||||
if (!this.isImmobile())
|
||||
this.connection
|
||||
@@ -1812,6 +1822,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||
@@ -1811,6 +1821,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||
}
|
||||
@Override
|
||||
public void closeContainer(org.bukkit.event.inventory.InventoryCloseEvent.Reason reason) {
|
||||
@@ -671,7 +694,7 @@ index ccd442b24693bc9269cc8ab3e44887d0ad3eadbd..ac7ac519ecc58a31c4b9efc24f054ec0
|
||||
// Paper end - Inventory close reason
|
||||
this.connection.send(new ClientboundContainerClosePacket(this.containerMenu.containerId));
|
||||
diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java
|
||||
index 8b1652805a2ac9ebae9c99dd77e81c7a484a7abb..e4bccc642abe15b0ec4b1cf2634801065a27e11a 100644
|
||||
index 34c5c2e3d6b0706cb91ec0171969cf81e94741a4..a1249d66c3693374b0f57c83302d05a7cbc2a306 100644
|
||||
--- a/net/minecraft/server/players/PlayerList.java
|
||||
+++ b/net/minecraft/server/players/PlayerList.java
|
||||
@@ -252,6 +252,8 @@ public abstract class PlayerList {
|
||||
@@ -688,12 +711,12 @@ index 8b1652805a2ac9ebae9c99dd77e81c7a484a7abb..e4bccc642abe15b0ec4b1cf263480106
|
||||
|
||||
public ServerPlayer respawn(ServerPlayer player, boolean keepInventory, Entity.RemovalReason reason, @Nullable org.bukkit.event.player.PlayerRespawnEvent.RespawnReason eventReason, @Nullable org.bukkit.Location location) {
|
||||
+ // Leaf start - SparklyPaper - parallel world ticking mod (make configurable)
|
||||
+ if (org.dreeam.leaf.config.modules.async.SparklyPaperParallelWorldTicking.enabled) {
|
||||
+ if (location != null) // Leaf - THIS CAN BE NULL; see PlayerList::respawn(ServerPlayer, boolean, Entity.RemovalReason, PlayerRespawnEvent.RespawnReason)
|
||||
+ ca.spottedleaf.moonrise.common.util.TickThread.ensureOnlyTickThread("Cannot respawn player off-main, from world " + player.serverLevel().getWorld().getName() + " to world " + location.getWorld().getName());
|
||||
+ else
|
||||
+ ca.spottedleaf.moonrise.common.util.TickThread.ensureOnlyTickThread("Cannot respawn player off-main, respawning in world " + player.serverLevel().getWorld().getName());
|
||||
+ // SparklyPaper end - parallel world ticking (additional concurrency issues logs)
|
||||
+ if (org.dreeam.leaf.config.modules.async.SparklyPaperParallelWorldTicking.enabled && !this.server.isSameThread()) {
|
||||
+ // Respawning is a complex operation that modifies global player lists and can interact with multiple
|
||||
+ // worlds. It must be executed on the main server thread to ensure thread safety. We block the
|
||||
+ // calling (world) thread to wait for the result, preserving the synchronous API contract of this method.
|
||||
+ org.bukkit.Location finalLocation = location;
|
||||
+ return this.server.submit(() -> this.respawn(player, keepInventory, reason, eventReason, finalLocation)).join();
|
||||
+ }
|
||||
+ // Leaf end - SparklyPaper - parallel world ticking mod (make configurable)
|
||||
player.stopRiding(); // CraftBukkit
|
||||
@@ -1104,10 +1127,21 @@ index d306f5f524dc64618df94c9783c2168dc561a5e3..2e0aec5327d92f89f38bbc393b3ba705
|
||||
return true;
|
||||
} else {
|
||||
diff --git a/net/minecraft/world/level/block/RedStoneWireBlock.java b/net/minecraft/world/level/block/RedStoneWireBlock.java
|
||||
index 1943a6aad888647953e2d9dbbeedb0bd81c6f9df..3902c21a0a4f456a4e1b966a0301c15f8c20a298 100644
|
||||
index 1943a6aad888647953e2d9dbbeedb0bd81c6f9df..ccc98d71da3c1150878f96801fbf65bfa1a64472 100644
|
||||
--- a/net/minecraft/world/level/block/RedStoneWireBlock.java
|
||||
+++ b/net/minecraft/world/level/block/RedStoneWireBlock.java
|
||||
@@ -283,7 +283,12 @@ public class RedStoneWireBlock extends Block {
|
||||
@@ -65,7 +65,10 @@ public class RedStoneWireBlock extends Block {
|
||||
private final Function<BlockState, VoxelShape> shapes;
|
||||
private final BlockState crossState;
|
||||
private final RedstoneWireEvaluator evaluator = new DefaultRedstoneWireEvaluator(this);
|
||||
+ // Leaf start - SparklyPaper - parallel world ticking mod (make configurable)
|
||||
public boolean shouldSignal = true;
|
||||
+ private final ThreadLocal<Boolean> shouldSignalTL = ThreadLocal.withInitial(() -> true);
|
||||
+ // Leaf end - SparklyPaper - parallel world ticking mod (make configurable)
|
||||
|
||||
@Override
|
||||
public MapCodec<RedStoneWireBlock> codec() {
|
||||
@@ -283,7 +286,12 @@ public class RedStoneWireBlock extends Block {
|
||||
if (orientation != null) {
|
||||
source = pos.relative(orientation.getFront().getOpposite());
|
||||
}
|
||||
@@ -1121,7 +1155,7 @@ index 1943a6aad888647953e2d9dbbeedb0bd81c6f9df..3902c21a0a4f456a4e1b966a0301c15f
|
||||
return;
|
||||
}
|
||||
updatePowerStrength(worldIn, pos, state, orientation, blockAdded);
|
||||
@@ -311,7 +316,12 @@ public class RedStoneWireBlock extends Block {
|
||||
@@ -311,7 +319,12 @@ public class RedStoneWireBlock extends Block {
|
||||
// [Space Walker] suppress shape updates and emit those manually to
|
||||
// bypass the new neighbor update stack.
|
||||
if (level.setBlock(pos, state, Block.UPDATE_KNOWN_SHAPE | Block.UPDATE_CLIENTS)) {
|
||||
@@ -1135,6 +1169,76 @@ index 1943a6aad888647953e2d9dbbeedb0bd81c6f9df..3902c21a0a4f456a4e1b966a0301c15f
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -328,10 +341,19 @@ public class RedStoneWireBlock extends Block {
|
||||
}
|
||||
|
||||
public int getBlockSignal(Level level, BlockPos pos) {
|
||||
- this.shouldSignal = false;
|
||||
- int bestNeighborSignal = level.getBestNeighborSignal(pos);
|
||||
- this.shouldSignal = true;
|
||||
- return bestNeighborSignal;
|
||||
+ // Leaf start - SparklyPaper - parallel world ticking mod (make configurable)
|
||||
+ if (org.dreeam.leaf.config.modules.async.SparklyPaperParallelWorldTicking.enabled) {
|
||||
+ this.shouldSignalTL.set(false);
|
||||
+ int bestNeighborSignal = level.getBestNeighborSignal(pos);
|
||||
+ this.shouldSignalTL.set(true);
|
||||
+ return bestNeighborSignal;
|
||||
+ } else {
|
||||
+ this.shouldSignal = false;
|
||||
+ int bestNeighborSignal = level.getBestNeighborSignal(pos);
|
||||
+ this.shouldSignal = true;
|
||||
+ return bestNeighborSignal;
|
||||
+ }
|
||||
+ // Leaf end - SparklyPaper - parallel world ticking mod (make configurable)
|
||||
}
|
||||
|
||||
private void checkCornerChangeAt(Level level, BlockPos pos) {
|
||||
@@ -422,12 +444,21 @@ public class RedStoneWireBlock extends Block {
|
||||
|
||||
@Override
|
||||
protected int getDirectSignal(BlockState blockState, BlockGetter blockAccess, BlockPos pos, Direction side) {
|
||||
- return !this.shouldSignal ? 0 : blockState.getSignal(blockAccess, pos, side);
|
||||
+ // Leaf start - SparklyPaper - parallel world ticking mod (make configurable)
|
||||
+ boolean signal = org.dreeam.leaf.config.modules.async.SparklyPaperParallelWorldTicking.enabled ? this.shouldSignalTL.get() : this.shouldSignal;
|
||||
+ return !signal ? 0 : blockState.getSignal(blockAccess, pos, side);
|
||||
+ // Leaf end - SparklyPaper - parallel world ticking mod (make configurable)
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getSignal(BlockState blockState, BlockGetter blockAccess, BlockPos pos, Direction side) {
|
||||
- if (this.shouldSignal && side != Direction.DOWN) {
|
||||
+ // Leaf start - SparklyPaper - parallel world ticking mod (make configurable)
|
||||
+ boolean signal;
|
||||
+ if (org.dreeam.leaf.config.modules.async.SparklyPaperParallelWorldTicking.enabled)
|
||||
+ signal = this.shouldSignalTL.get();
|
||||
+ else
|
||||
+ signal = this.shouldSignal;
|
||||
+ if (signal && side != Direction.DOWN) {
|
||||
int powerValue = blockState.getValue(POWER);
|
||||
if (powerValue == 0) {
|
||||
return 0;
|
||||
@@ -441,6 +472,7 @@ public class RedStoneWireBlock extends Block {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
+ // Leaf end - SparklyPaper - parallel world ticking mod (make configurable)
|
||||
|
||||
protected static boolean shouldConnectTo(BlockState state) {
|
||||
return shouldConnectTo(state, null);
|
||||
@@ -459,7 +491,12 @@ public class RedStoneWireBlock extends Block {
|
||||
|
||||
@Override
|
||||
protected boolean isSignalSource(BlockState state) {
|
||||
- return this.shouldSignal;
|
||||
+ // Leaf start - SparklyPaper - parallel world ticking mod (make configurable)
|
||||
+ if (org.dreeam.leaf.config.modules.async.SparklyPaperParallelWorldTicking.enabled)
|
||||
+ return this.shouldSignalTL.get();
|
||||
+ else
|
||||
+ return this.shouldSignal;
|
||||
+ // Leaf end - SparklyPaper - parallel world ticking mod (make configurable)
|
||||
}
|
||||
|
||||
public static int getColorForPower(int power) {
|
||||
diff --git a/net/minecraft/world/level/block/SaplingBlock.java b/net/minecraft/world/level/block/SaplingBlock.java
|
||||
index a22cb810622e0ae97bc2a0d6390d026d9482b783..3e7478e959da3a0191de6c76b80cbb9b625b6898 100644
|
||||
--- a/net/minecraft/world/level/block/SaplingBlock.java
|
||||
@@ -6,10 +6,10 @@ Subject: [PATCH] SparklyPaper: Track each world MSPT
|
||||
Original project: https://github.com/SparklyPower/SparklyPaper
|
||||
|
||||
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
|
||||
index c9b8bc9592d5fce77750de89fa886db383d92a89..1dc599e28682b59c8389ff2ada100b405bf97240 100644
|
||||
index 543bdb926426bfd5be01d0c23e8c9e274b94485c..9933a60db91d68f76df33ccddea0852fd59b8983 100644
|
||||
--- a/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/net/minecraft/server/MinecraftServer.java
|
||||
@@ -1687,7 +1687,16 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -1682,7 +1682,16 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
// Leaf start - SparklyPaper - parallel world ticking mod (move level ticking logic out for branch convergence)
|
||||
private void tickLevel(ServerLevel serverLevel, BooleanSupplier hasTimeLeft) {
|
||||
try {
|
||||
@@ -0,0 +1,52 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Taiyou06 <kaandindar21@gmail.com>
|
||||
Date: Sun, 6 Apr 2025 11:22:35 +0200
|
||||
Subject: [PATCH] More virtual threads
|
||||
|
||||
|
||||
diff --git a/net/minecraft/Util.java b/net/minecraft/Util.java
|
||||
index 9918572306e983281d05c6d28c8a5d843348ad2d..2491ca5bcabcf8ae99ef990eed4e1fd94f799991 100644
|
||||
--- a/net/minecraft/Util.java
|
||||
+++ b/net/minecraft/Util.java
|
||||
@@ -98,7 +98,8 @@ public class Util {
|
||||
public static final TracingExecutor DIMENSION_DATA_IO_POOL = makeExtraIoExecutor("Dimension-Data-IO-Worker-"); // Paper - Separate dimension data IO pool
|
||||
private static final TracingExecutor DOWNLOAD_POOL = makeIoExecutor("Download-", true);
|
||||
// Paper start - don't submit BLOCKING PROFILE LOOKUPS to the world gen thread
|
||||
- public static final ExecutorService PROFILE_EXECUTOR = Executors.newFixedThreadPool(2, new java.util.concurrent.ThreadFactory() {
|
||||
+ // Leaf start - More virtual threads
|
||||
+ public static final ExecutorService PROFILE_EXECUTOR = createProfileExecutor(); /* new Executors.newFixedThreadPool(2, new java.util.concurrent.ThreadFactory() {
|
||||
|
||||
private final AtomicInteger count = new AtomicInteger();
|
||||
|
||||
@@ -111,7 +112,30 @@ public class Util {
|
||||
});
|
||||
return ret;
|
||||
}
|
||||
- });
|
||||
+ }); */
|
||||
+
|
||||
+ private static ExecutorService createProfileExecutor() {
|
||||
+ final java.util.concurrent.ThreadFactory factory;
|
||||
+ if (org.dreeam.leaf.config.modules.opt.VT4ProfileExecutor.enabled && org.galemc.gale.virtualthread.VirtualThreadService.isSupported()) {
|
||||
+ factory = org.galemc.gale.virtualthread.VirtualThreadService.get().createFactory();
|
||||
+ } else {
|
||||
+ factory = new java.util.concurrent.ThreadFactory() {
|
||||
+ private final AtomicInteger count = new AtomicInteger();
|
||||
+
|
||||
+ @Override
|
||||
+ public Thread newThread(Runnable run) {
|
||||
+ Thread ret = new Thread(run);
|
||||
+ ret.setName("Profile Lookup Executor #" + this.count.getAndIncrement());
|
||||
+ ret.setUncaughtExceptionHandler((Thread thread, Throwable throwable) -> {
|
||||
+ LOGGER.error("Uncaught exception in thread " + thread.getName(), throwable);
|
||||
+ });
|
||||
+ return ret;
|
||||
+ }
|
||||
+ };
|
||||
+ }
|
||||
+ return Executors.newFixedThreadPool(2, factory);
|
||||
+ }
|
||||
+ // Leaf end - More virtual threads
|
||||
// Paper end - don't submit BLOCKING PROFILE LOOKUPS to the world gen thread
|
||||
private static final DateTimeFormatter FILENAME_DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH.mm.ss", Locale.ROOT);
|
||||
public static final int LINEAR_LOOKUP_THRESHOLD = 8;
|
||||
@@ -106,7 +106,7 @@ index 7b686d834e4eb36be5758b0e0a846a70d1e2294b..956d48fb7146b9eb2a5b5b4e23a83f60
|
||||
final EntityCollectionBySection byType = this.entitiesByType.get(entity.getType());
|
||||
byType.removeEntity(entity, sectionIndex);
|
||||
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
|
||||
index 1dc599e28682b59c8389ff2ada100b405bf97240..c2c904565df5fb320b98307a4d451066286ad726 100644
|
||||
index 9933a60db91d68f76df33ccddea0852fd59b8983..14c4dfb497ab050adfffebb8d75e6fe89c38effc 100644
|
||||
--- a/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/net/minecraft/server/MinecraftServer.java
|
||||
@@ -291,6 +291,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -117,21 +117,6 @@ index 1dc599e28682b59c8389ff2ada100b405bf97240..c2c904565df5fb320b98307a4d451066
|
||||
|
||||
public static <S extends MinecraftServer> S spin(Function<Thread, S> threadFunction) {
|
||||
AtomicReference<S> atomicReference = new AtomicReference<>();
|
||||
@@ -1092,6 +1093,14 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
org.dreeam.leaf.async.AsyncPlayerDataSaving.IO_POOL.awaitTermination(30, java.util.concurrent.TimeUnit.SECONDS);
|
||||
} catch (java.lang.InterruptedException ignored) {}
|
||||
// Leaf end - Async playerdata saving
|
||||
+ // Leaf start - Async target finding
|
||||
+ if (this.asyncGoalThread != null) {
|
||||
+ try {
|
||||
+ this.asyncGoalThread.join();
|
||||
+ } catch (java.lang.InterruptedException ignored) {
|
||||
+ }
|
||||
+ }
|
||||
+ // Leaf end - Async target finding
|
||||
}
|
||||
|
||||
public String getLocalIp() {
|
||||
diff --git a/net/minecraft/server/dedicated/DedicatedServer.java b/net/minecraft/server/dedicated/DedicatedServer.java
|
||||
index 72e871b8c7fee9b5cbd567e03baee80ee4b9c82e..574765713c194a6cf3eb7c125e78ed77c82aba2e 100644
|
||||
--- a/net/minecraft/server/dedicated/DedicatedServer.java
|
||||
@@ -1,112 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Taiyou06 <kaandindar21@gmail.com>
|
||||
Date: Sun, 6 Apr 2025 11:22:35 +0200
|
||||
Subject: [PATCH] More virtual threads
|
||||
|
||||
|
||||
diff --git a/net/minecraft/Util.java b/net/minecraft/Util.java
|
||||
index 9918572306e983281d05c6d28c8a5d843348ad2d..1d4ad1370ca041753ce765b1a2feddae59f1f8ca 100644
|
||||
--- a/net/minecraft/Util.java
|
||||
+++ b/net/minecraft/Util.java
|
||||
@@ -98,7 +98,8 @@ public class Util {
|
||||
public static final TracingExecutor DIMENSION_DATA_IO_POOL = makeExtraIoExecutor("Dimension-Data-IO-Worker-"); // Paper - Separate dimension data IO pool
|
||||
private static final TracingExecutor DOWNLOAD_POOL = makeIoExecutor("Download-", true);
|
||||
// Paper start - don't submit BLOCKING PROFILE LOOKUPS to the world gen thread
|
||||
- public static final ExecutorService PROFILE_EXECUTOR = Executors.newFixedThreadPool(2, new java.util.concurrent.ThreadFactory() {
|
||||
+ // Leaf start - More virtual threads
|
||||
+ public static final ExecutorService PROFILE_EXECUTOR = createProfileExecutor(); /* new Executors.newFixedThreadPool(2, new java.util.concurrent.ThreadFactory() {
|
||||
|
||||
private final AtomicInteger count = new AtomicInteger();
|
||||
|
||||
@@ -111,7 +112,30 @@ public class Util {
|
||||
});
|
||||
return ret;
|
||||
}
|
||||
- });
|
||||
+ }); */
|
||||
+
|
||||
+ private static ExecutorService createProfileExecutor() {
|
||||
+ final java.util.concurrent.ThreadFactory factory;
|
||||
+ if (org.dreeam.leaf.config.modules.opt.VT4ProfileExecutor.enabled && org.galemc.gale.virtualthread.VirtualThreadService.isSupported()) {
|
||||
+ factory = org.galemc.gale.virtualthread.VirtualThreadService.get().createFactory();
|
||||
+ } else {
|
||||
+ factory = new java.util.concurrent.ThreadFactory() {
|
||||
+ private final AtomicInteger count = new AtomicInteger();
|
||||
+
|
||||
+ @Override
|
||||
+ public Thread newThread(Runnable run) {
|
||||
+ Thread ret = new Thread(run);
|
||||
+ ret.setName("Profile Lookup Executor #" + this.count.getAndIncrement());
|
||||
+ ret.setUncaughtExceptionHandler((Thread thread, Throwable throwable) -> {
|
||||
+ LOGGER.error("Uncaught exception in thread " + thread.getName(), throwable);
|
||||
+ });
|
||||
+ return ret;
|
||||
+ }
|
||||
+ };
|
||||
+ }
|
||||
+ return Executors.newFixedThreadPool(2, factory);
|
||||
+ }
|
||||
+ // Leaf end - More virtual threads
|
||||
// Paper end - don't submit BLOCKING PROFILE LOOKUPS to the world gen thread
|
||||
private static final DateTimeFormatter FILENAME_DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH.mm.ss", Locale.ROOT);
|
||||
public static final int LINEAR_LOOKUP_THRESHOLD = 8;
|
||||
@@ -255,16 +279,31 @@ public class Util {
|
||||
}
|
||||
|
||||
private static TracingExecutor makeIoExecutor(String name, boolean daemon) {
|
||||
- AtomicInteger atomicInteger = new AtomicInteger(1);
|
||||
- return new TracingExecutor(Executors.newCachedThreadPool(task -> {
|
||||
- Thread thread = new Thread(task);
|
||||
- String string = name + atomicInteger.getAndIncrement();
|
||||
- TracyClient.setThreadName(string, name.hashCode());
|
||||
- thread.setName(string);
|
||||
- thread.setDaemon(daemon);
|
||||
- thread.setUncaughtExceptionHandler(Util::onThreadException);
|
||||
- return thread;
|
||||
- }));
|
||||
+ // Leaf start - More virtual threads
|
||||
+ final java.util.concurrent.ThreadFactory factory;
|
||||
+ final boolean useVirtualThreads; // Gale - virtual thread support
|
||||
+ if (name.startsWith("Download-")) { // Gale - virtual thread support
|
||||
+ useVirtualThreads = org.dreeam.leaf.config.modules.opt.VT4DownloadPool.enabled && org.galemc.gale.virtualthread.VirtualThreadService.isSupported(); // Gale - virtual thread support
|
||||
+ } else {
|
||||
+ useVirtualThreads = false;
|
||||
+ }
|
||||
+
|
||||
+ if (useVirtualThreads) {
|
||||
+ factory = org.galemc.gale.virtualthread.VirtualThreadService.get().createFactory();
|
||||
+ } else {
|
||||
+ AtomicInteger atomicInteger = new AtomicInteger(1);
|
||||
+ factory = task -> {
|
||||
+ Thread thread = new Thread(task);
|
||||
+ String string = name + atomicInteger.getAndIncrement();
|
||||
+ TracyClient.setThreadName(string, name.hashCode());
|
||||
+ thread.setName(string);
|
||||
+ thread.setDaemon(daemon);
|
||||
+ thread.setUncaughtExceptionHandler(Util::onThreadException);
|
||||
+ return thread;
|
||||
+ };
|
||||
+ }
|
||||
+ return new TracingExecutor(Executors.newCachedThreadPool(factory));
|
||||
+ // Leaf end - More virtual threads
|
||||
}
|
||||
|
||||
// Paper start - Separate dimension data IO pool
|
||||
@@ -1109,7 +1148,7 @@ public class Util {
|
||||
}
|
||||
|
||||
public static <T> Typed<T> readTypedOrThrow(Type<T> type, Dynamic<?> data, boolean partial) {
|
||||
- DataResult<Typed<T>> dataResult = type.readTyped(data).map(Pair::getFirst);
|
||||
+ DataResult<Typed<T>> dataResult = type.readTyped(data).map(Pair::getFirst); // Paper - Fix generics issue // Gale - Fix generics issue
|
||||
|
||||
try {
|
||||
return partial ? dataResult.getPartialOrThrow(IllegalStateException::new) : dataResult.getOrThrow(IllegalStateException::new);
|
||||
@@ -1158,7 +1197,7 @@ public class Util {
|
||||
}
|
||||
|
||||
public void openUri(URI uri) {
|
||||
- throw new IllegalStateException("This method is not useful on dedicated servers."); // Paper - Fix warnings on build by removing client-only code
|
||||
+ // throw new IllegalStateException("This method is not useful on dedicated servers."); // Paper - Fix warnings on build by removing client-only code // Leaf - More virtual threads - This method is not useful on dedicated servers
|
||||
}
|
||||
|
||||
public void openFile(File file) {
|
||||
@@ -27,7 +27,7 @@ index 3a78e7512772fd3f7cf8f221e3a72474def14bea..ba52af914e9e231caa0ac50562e9a692
|
||||
public static final int GENERATED_TICKET_LEVEL = ChunkHolderManager.FULL_LOADED_TICKET_LEVEL;
|
||||
public static final int LOADED_TICKET_LEVEL = ChunkTaskScheduler.getTicketLevel(ChunkStatus.EMPTY);
|
||||
diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java
|
||||
index e4bccc642abe15b0ec4b1cf2634801065a27e11a..6a9aa085956ddd27e8910dd524ecb79caf9ae0ba 100644
|
||||
index a1249d66c3693374b0f57c83302d05a7cbc2a306..2ea112ed64d5dc7c5eb365e7a518cf0e8dd4927f 100644
|
||||
--- a/net/minecraft/server/players/PlayerList.java
|
||||
+++ b/net/minecraft/server/players/PlayerList.java
|
||||
@@ -434,6 +434,13 @@ public abstract class PlayerList {
|
||||
@@ -22,10 +22,10 @@ index 56fd1ed7ccaf96e7eedea60fbdbf7f934939d563..d2f522ea6d0a209496848af073c9af1c
|
||||
}
|
||||
|
||||
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
|
||||
index c2c904565df5fb320b98307a4d451066286ad726..84b90f496e5ab59d43503301fe935627af123e3f 100644
|
||||
index 14c4dfb497ab050adfffebb8d75e6fe89c38effc..54f5336b5bb56cb9dfda2b75fff07bae0b27cfd3 100644
|
||||
--- a/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/net/minecraft/server/MinecraftServer.java
|
||||
@@ -1833,6 +1833,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -1820,6 +1820,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
}
|
||||
|
||||
org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handleTick(tickCount); // Leaves - protocol
|
||||
@@ -33,20 +33,8 @@ index c2c904565df5fb320b98307a4d451066286ad726..84b90f496e5ab59d43503301fe935627
|
||||
|
||||
for (int i = 0; i < this.tickables.size(); i++) {
|
||||
this.tickables.get(i).run();
|
||||
diff --git a/net/minecraft/server/level/ServerEntity.java b/net/minecraft/server/level/ServerEntity.java
|
||||
index 16b2ca8c96e9561aa57e0903d1e98e6441044b6d..939400c18eb4e87e0bf1b131e1601f4dcaa4885c 100644
|
||||
--- a/net/minecraft/server/level/ServerEntity.java
|
||||
+++ b/net/minecraft/server/level/ServerEntity.java
|
||||
@@ -297,6 +297,7 @@ public class ServerEntity {
|
||||
this.entity.hurtMarked = false;
|
||||
this.broadcastAndSend(new ClientboundSetEntityMotionPacket(this.entity));
|
||||
}
|
||||
+ if (entity instanceof ServerPlayer serverPlayer) org.dreeam.leaf.protocol.Protocols.tickTracker(serverPlayer); // Leaf - Protocol core
|
||||
}
|
||||
|
||||
private Stream<Entity> mountedOrDismounted(List<Entity> entities) {
|
||||
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
|
||||
index ac7ac519ecc58a31c4b9efc24f054ec014851fb4..59a61ac969e79966484a839b7d9ca0ac50e80994 100644
|
||||
index bc955da0dff79262dace84d255f27b3271a91ca5..7abc297d91d6e1b21b855424b345dba4f4df37b6 100644
|
||||
--- a/net/minecraft/server/level/ServerPlayer.java
|
||||
+++ b/net/minecraft/server/level/ServerPlayer.java
|
||||
@@ -805,6 +805,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||
@@ -71,7 +59,7 @@ index 18f0d486c478087f404d8bb6cd840079e2c8d239..1a6f1c5f4cf13ee50bc8445845cbb973
|
||||
final byte[] data = discardedPayload.data();
|
||||
try {
|
||||
diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java
|
||||
index 6a9aa085956ddd27e8910dd524ecb79caf9ae0ba..e0f6b82d9836cb73f6fe631071bb1a0c5ec77eab 100644
|
||||
index 2ea112ed64d5dc7c5eb365e7a518cf0e8dd4927f..24a5fd508e36238aade92fcae1c97cb38159506a 100644
|
||||
--- a/net/minecraft/server/players/PlayerList.java
|
||||
+++ b/net/minecraft/server/players/PlayerList.java
|
||||
@@ -686,6 +686,7 @@ public abstract class PlayerList {
|
||||
@@ -5,7 +5,7 @@ Subject: [PATCH] Async switch connection state
|
||||
|
||||
|
||||
diff --git a/net/minecraft/network/Connection.java b/net/minecraft/network/Connection.java
|
||||
index f3e9de8716f5e1a72ec465ee897c8f0413f7b1c3..c83ee2137a57e62003b1d20c3ceea9f569350a53 100644
|
||||
index f3e9de8716f5e1a72ec465ee897c8f0413f7b1c3..3dce0665e7438d2994a86450e31fb2a10431df9b 100644
|
||||
--- a/net/minecraft/network/Connection.java
|
||||
+++ b/net/minecraft/network/Connection.java
|
||||
@@ -342,6 +342,11 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
|
||||
@@ -36,22 +36,11 @@ index f3e9de8716f5e1a72ec465ee897c8f0413f7b1c3..c83ee2137a57e62003b1d20c3ceea9f5
|
||||
}
|
||||
}
|
||||
|
||||
@@ -369,7 +381,38 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
|
||||
}
|
||||
@@ -373,6 +385,31 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
|
||||
}
|
||||
}
|
||||
|
||||
boolean flag = protocolInfo.id() == ConnectionProtocol.LOGIN;
|
||||
- syncAfterConfigurationChange(this.channel.writeAndFlush(outboundConfigurationTask.andThen(context -> this.sendLoginDisconnect = flag)));
|
||||
+ var cf = this.channel.writeAndFlush(outboundConfigurationTask.andThen(context -> this.sendLoginDisconnect = flag));
|
||||
+ // Leaf start - Async switch connection state
|
||||
+ if (org.dreeam.leaf.config.modules.network.AlternativeJoin.enabled) {
|
||||
+ if (ca.spottedleaf.moonrise.common.util.TickThread.isTickThread()) {
|
||||
+ throw new IllegalStateException("Thread failed netty thread check: Switching outbound protocol state use setupOutboundProtocolAsync instead");
|
||||
+ }
|
||||
+ }
|
||||
+ syncAfterConfigurationChange(cf);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ // Leaf start - Async switch connection state
|
||||
+ public @Nullable ChannelFuture setupOutboundProtocolAsync(ProtocolInfo<?> protocolInfo) {
|
||||
+ if (protocolInfo.flow() != this.getSending()) {
|
||||
+ throw new IllegalStateException("Invalid outbound protocol: " + protocolInfo.id());
|
||||
@@ -72,10 +61,13 @@ index f3e9de8716f5e1a72ec465ee897c8f0413f7b1c3..c83ee2137a57e62003b1d20c3ceea9f5
|
||||
+ return cf;
|
||||
+ }
|
||||
+ return null;
|
||||
+ // Leaf end - Async switch connection state
|
||||
}
|
||||
}
|
||||
|
||||
+ }
|
||||
+ }
|
||||
+ // Leaf end - Async switch connection state
|
||||
+
|
||||
public void setListenerForServerboundHandshake(PacketListener packetListener) {
|
||||
if (this.packetListener != null) {
|
||||
throw new IllegalStateException("Listener already set");
|
||||
diff --git a/net/minecraft/server/network/ServerConfigurationPacketListenerImpl.java b/net/minecraft/server/network/ServerConfigurationPacketListenerImpl.java
|
||||
index 2e9eb04c7c4342393c05339906c267bca9ff29b1..53b9daa909c2b89046d5af515e17afe09ea7015a 100644
|
||||
--- a/net/minecraft/server/network/ServerConfigurationPacketListenerImpl.java
|
||||
@@ -118,10 +110,10 @@ index 2e9eb04c7c4342393c05339906c267bca9ff29b1..53b9daa909c2b89046d5af515e17afe0
|
||||
try {
|
||||
PlayerList playerList = this.server.getPlayerList();
|
||||
diff --git a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
||||
index 405b62c082017024abae7ccc1db5f74caab1eabf..1ad1fc46775a473e6f7fd97eac4b8c7110c7332b 100644
|
||||
index 6b0b0ccc18a5da05685867656705e1fcf94b5891..889bab9613fb32d239bb0613db4a900a442116a3 100644
|
||||
--- a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
||||
+++ b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
||||
@@ -471,11 +471,31 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
|
||||
@@ -493,11 +493,31 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
|
||||
this.disconnect(ServerCommonPacketListenerImpl.DISCONNECT_UNEXPECTED_QUERY);
|
||||
}
|
||||
|
||||
@@ -150,7 +142,7 @@ index 405b62c082017024abae7ccc1db5f74caab1eabf..1ad1fc46775a473e6f7fd97eac4b8c71
|
||||
net.minecraft.network.protocol.PacketUtils.ensureRunningOnSameThread(packet, this, this.server); // CraftBukkit
|
||||
Validate.validState(this.state == ServerLoginPacketListenerImpl.State.PROTOCOL_SWITCHING, "Unexpected login acknowledgement packet");
|
||||
- this.connection.setupOutboundProtocol(ConfigurationProtocols.CLIENTBOUND);
|
||||
+ if (!org.dreeam.leaf.config.modules.network.AlternativeJoin.enabled) this.connection.setupOutboundProtocol(ConfigurationProtocols.CLIENTBOUND); // Leaf - Async switch connection state
|
||||
+ if (!org.dreeam.leaf.config.modules.network.AlternativeJoin.enabled) this.connection.setupOutboundProtocol(ConfigurationProtocols.CLIENTBOUND); // Leaf - Async switch connection state
|
||||
CommonListenerCookie commonListenerCookie = CommonListenerCookie.createInitial(Objects.requireNonNull(this.authenticatedProfile), this.transferred);
|
||||
ServerConfigurationPacketListenerImpl serverConfigurationPacketListenerImpl = new ServerConfigurationPacketListenerImpl(
|
||||
this.server, this.connection, commonListenerCookie, this.player // CraftBukkit
|
||||
@@ -1,11 +1,11 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Taiyou06 <kaandindar21@gmail.com>
|
||||
Date: Thu, 8 May 2025 13:30:07 +0200
|
||||
Subject: [PATCH] Optimise BlockEntities tickersInLevel
|
||||
Subject: [PATCH] Optimize BlockEntities tickersInLevel
|
||||
|
||||
|
||||
diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java
|
||||
index e82e55ec400c5e338502ed7ce433372a88d4acff..155e9b807a61ab1212ee25cc79a386821596dedc 100644
|
||||
index e82e55ec400c5e338502ed7ce433372a88d4acff..31f19dfe16e270b55f3b44754c97ed8d9fa422cf 100644
|
||||
--- a/net/minecraft/world/level/chunk/LevelChunk.java
|
||||
+++ b/net/minecraft/world/level/chunk/LevelChunk.java
|
||||
@@ -73,7 +73,7 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p
|
||||
@@ -13,7 +13,7 @@ index e82e55ec400c5e338502ed7ce433372a88d4acff..155e9b807a61ab1212ee25cc79a38682
|
||||
}
|
||||
};
|
||||
- private final Map<BlockPos, LevelChunk.RebindableTickingBlockEntityWrapper> tickersInLevel = Maps.newHashMap();
|
||||
+ private final Map<BlockPos, LevelChunk.RebindableTickingBlockEntityWrapper> tickersInLevel = org.dreeam.leaf.config.modules.opt.OptimiseBlockEntities.enabled ? new it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap<>() : Maps.newHashMap(); // Leaf - Optimise BlockEntities tickersInLevel
|
||||
+ private final Map<BlockPos, LevelChunk.RebindableTickingBlockEntityWrapper> tickersInLevel = org.dreeam.leaf.config.modules.opt.OptimizeBlockEntities.enabled ? new it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap<>() : Maps.newHashMap(); // Leaf - Optimise BlockEntities tickersInLevel
|
||||
public boolean loaded;
|
||||
public final ServerLevel level; // CraftBukkit - type
|
||||
@Nullable
|
||||
@@ -5,7 +5,7 @@ Subject: [PATCH] Only tick items at hand
|
||||
|
||||
|
||||
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
|
||||
index 59a61ac969e79966484a839b7d9ca0ac50e80994..82ac99c3c5b374482f3ff18f5d20bf888091e539 100644
|
||||
index 7abc297d91d6e1b21b855424b345dba4f4df37b6..0c81dca5905c2d4c166661dc3473b0c1e9aa5265 100644
|
||||
--- a/net/minecraft/server/level/ServerPlayer.java
|
||||
+++ b/net/minecraft/server/level/ServerPlayer.java
|
||||
@@ -834,12 +834,19 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||
@@ -5,7 +5,7 @@ Subject: [PATCH] Add configurable death item drop knockback settings
|
||||
|
||||
|
||||
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
|
||||
index 82ac99c3c5b374482f3ff18f5d20bf888091e539..c9fbbbef8d006a90023c70419b5be7220602ee3b 100644
|
||||
index 0c81dca5905c2d4c166661dc3473b0c1e9aa5265..373059fcccdab0a918aa1d1a4a613fb62fef8a18 100644
|
||||
--- a/net/minecraft/server/level/ServerPlayer.java
|
||||
+++ b/net/minecraft/server/level/ServerPlayer.java
|
||||
@@ -1053,7 +1053,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user