merge upstream 1.21.8
This commit is contained in:
commit
e39ece4d78
172 files changed
+3320
-2510
No files matched your search
@@ -7,13 +7,12 @@ on: [pull_request]
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
Build:
|
Build:
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- name: Set up JDK 21
|
- name: Set up JDK 21
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v4
|
||||||
with:
|
with:
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
java-version: 21
|
java-version: 21
|
||||||
@@ -22,7 +21,7 @@ jobs:
|
|||||||
run: chmod +x gradlew
|
run: chmod +x gradlew
|
||||||
- name: Build with Gradle
|
- name: Build with Gradle
|
||||||
run: ./gradlew build
|
run: ./gradlew build
|
||||||
- uses: actions/upload-artifact@v3
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: "Compiled artifacts for Pull Request #${{github.event.number}}"
|
name: "Compiled artifacts for Pull Request #${{github.event.number}}"
|
||||||
path: build/libs
|
path: build/libs
|
||||||
@@ -11,9 +11,9 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- name: Set up JDK 21
|
- name: Set up JDK 21
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v4
|
||||||
with:
|
with:
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
java-version: 21
|
java-version: 21
|
||||||
@@ -22,7 +22,7 @@ jobs:
|
|||||||
run: chmod +x gradlew
|
run: chmod +x gradlew
|
||||||
- name: Build with Gradle
|
- name: Build with Gradle
|
||||||
run: ./gradlew build
|
run: ./gradlew build
|
||||||
- uses: actions/upload-artifact@v3
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: Compiled artifacts for ${{ github.sha }}
|
name: Compiled artifacts for ${{ github.sha }}
|
||||||
path: build/libs
|
path: build/libs
|
||||||
@@ -16,7 +16,7 @@ jobs:
|
|||||||
extra-branch-curse-version: ${{ steps.properties.outputs.release-extra-curse-version }}
|
extra-branch-curse-version: ${{ steps.properties.outputs.release-extra-curse-version }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout the sources
|
- name: Checkout the sources
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: Determine release type
|
- name: Determine release type
|
||||||
id: type
|
id: type
|
||||||
run: |
|
run: |
|
||||||
@@ -41,7 +41,7 @@ jobs:
|
|||||||
if ! ${{ steps.properties.outputs.release-extra-branch }}; then
|
if ! ${{ steps.properties.outputs.release-extra-branch }}; then
|
||||||
echo "matrix-to-exclude=Snapshots" >> $GITHUB_OUTPUT
|
echo "matrix-to-exclude=Snapshots" >> $GITHUB_OUTPUT
|
||||||
fi
|
fi
|
||||||
- uses: actions/github-script@v6
|
- uses: actions/github-script@v7
|
||||||
env:
|
env:
|
||||||
READ_VERSION: ${{ steps.properties.outputs.mod_version }}
|
READ_VERSION: ${{ steps.properties.outputs.mod_version }}
|
||||||
with:
|
with:
|
||||||
@@ -78,11 +78,11 @@ jobs:
|
|||||||
echo "curse-versions=${{ needs.Get-Properties.outputs.curse-versions }}" >> $GITHUB_OUTPUT
|
echo "curse-versions=${{ needs.Get-Properties.outputs.curse-versions }}" >> $GITHUB_OUTPUT
|
||||||
fi
|
fi
|
||||||
- name: Checkout the sources
|
- name: Checkout the sources
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
ref: ${{ steps.getbranchinfo.outputs.branchname }}
|
ref: ${{ steps.getbranchinfo.outputs.branchname }}
|
||||||
- name: Set up JDK 21
|
- name: Set up JDK 21
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v4
|
||||||
with:
|
with:
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
java-version: 21
|
java-version: 21
|
||||||
@@ -97,7 +97,7 @@ jobs:
|
|||||||
output="$(find build/libs/ ! -name "*-dev.jar" ! -name "*-sources.jar" -type f -printf "%f\n")"
|
output="$(find build/libs/ ! -name "*-dev.jar" ! -name "*-sources.jar" -type f -printf "%f\n")"
|
||||||
echo "jarname=$output" >> $GITHUB_OUTPUT
|
echo "jarname=$output" >> $GITHUB_OUTPUT
|
||||||
- name: Save build artifacts in the action
|
- name: Save build artifacts in the action
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: Artifacts for ${{ matrix.branch }}
|
name: Artifacts for ${{ matrix.branch }}
|
||||||
path: build/libs
|
path: build/libs
|
||||||
@@ -111,7 +111,7 @@ jobs:
|
|||||||
asset_name: ${{ steps.findjar.outputs.jarname }}
|
asset_name: ${{ steps.findjar.outputs.jarname }}
|
||||||
asset_content_type: application/java-archive
|
asset_content_type: application/java-archive
|
||||||
- name: Upload to Curseforge
|
- name: Upload to Curseforge
|
||||||
uses: itsmeow/curseforge-upload@v3
|
uses: itsmeow/curseforge-upload@v3.1.2
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.CF_API_TOKEN }}
|
token: ${{ secrets.CF_API_TOKEN }}
|
||||||
project_id: 349239
|
project_id: 349239
|
||||||
@@ -125,7 +125,7 @@ jobs:
|
|||||||
- name: Ask Gradle to publish
|
- name: Ask Gradle to publish
|
||||||
run: ./gradlew publish
|
run: ./gradlew publish
|
||||||
- name: Save publish folder in action's artifacts # Remove when automated
|
- name: Save publish folder in action's artifacts # Remove when automated
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: Maven publishing artifacts for ${{ matrix.branch }}
|
name: Maven publishing artifacts for ${{ matrix.branch }}
|
||||||
path: publish/carpet/fabric-carpet/
|
path: publish/carpet/fabric-carpet/
|
||||||
@@ -149,7 +149,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout the sources
|
- name: Checkout the sources
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
ref: master
|
ref: master
|
||||||
- name: Merge docs
|
- name: Merge docs
|
||||||
@@ -166,15 +166,15 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Carpet sources
|
- name: Checkout Carpet sources
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: Set up JDK 21
|
- name: Set up JDK 21
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v4
|
||||||
with:
|
with:
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
java-version: 21
|
java-version: 21
|
||||||
cache: 'gradle'
|
cache: 'gradle'
|
||||||
- name: Checkout wiki
|
- name: Checkout wiki
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
repository: ${{github.repository}}.wiki
|
repository: ${{github.repository}}.wiki
|
||||||
path: wiki
|
path: wiki
|
||||||
|
|||||||
@@ -0,0 +1,66 @@
|
|||||||
|
<img src="./src/main/resources/assets/carpet/icon.png" align="right" width="128px"/>
|
||||||
|
|
||||||
|
# Fabric Carpet
|
||||||
|
|
||||||
|
[](https://github.com/gnembon/fabric-carpet/actions/workflows/devbuild.yml)
|
||||||
|
[](https://www.curseforge.com/minecraft/mc-mods/carpet)
|
||||||
|
[](https://modrinth.com/mod/carpet)
|
||||||
|
[](https://github.com/gnembon/fabric-carpet/releases)
|
||||||
|
[](https://github.com/gnembon/fabric-carpet/graphs/contributors)
|
||||||
|
[](https://discord.gg/gn99m4QRY4)
|
||||||
|
|
||||||
|
English version of this [docs](https://github.com/gnembon/fabric-carpet/blob/master/README.md)
|
||||||
|
|
||||||
|
Cause all carpets are made of fabric?
|
||||||
|
|
||||||
|
Esto es la [Fabric](https://fabricmc.net/) version del Carpet Mod, para Minecraft 1.14.X, 1.15.X, 1.16.X y siguientes.
|
||||||
|
|
||||||
|
Carpet Mod es un mod para Minecraft Vanilla que permite tener un control total de lo que importa desde la perspectiva tecnica del juego.
|
||||||
|
|
||||||
|
* Prueba tus granjas durante varias horas en tan solo unos minutos con el comando [`/tick warp`](https://github.com/gnembon/fabric-carpet/wiki/Commands#usage-tick-warp-ticks-cmd), tan rapido como tu computadora pueda
|
||||||
|
* ...da un informe detallado de los items producido usando el comando [`/hopperCounters`](https://github.com/gnembon/fabric-carpet/wiki/Current-Available-Settings#hoppercounters)
|
||||||
|
* Ve la mobcap del server, TPS, etc. con actualizaciones en vivo con [`/log`](https://github.com/gnembon/fabric-carpet/wiki/Commands#log)
|
||||||
|
* Permite a los pistones mover entidades (por ejemplo. cofres) con [`/movableBlockEntities`](https://github.com/gnembon/fabric-carpet/wiki/Current-Available-Settings#movableblockentities)
|
||||||
|
* [Arregla](https://github.com/gnembon/fabric-carpet/wiki/Current-Available-Settings#leadfix) [muchas](https://github.com/gnembon/fabric-carpet/wiki/Current-Available-Settings#portalsuffocationfix) [cosas](https://github.com/gnembon/fabric-carpet/wiki/Current-Available-Settings#unloadedentityfix)
|
||||||
|
|
||||||
|
# ecosistema carpet
|
||||||
|
|
||||||
|
Para funcionalidades del ecosistema de carpet este el lugar correcto. Ve las descargas disponibles en [pagina de descargas](https://github.com/gnembon/fabric-carpet/releases)
|
||||||
|
|
||||||
|
|
||||||
|
<img src="https://raw.githubusercontent.com/gnembon/carpet-extra/master/src/main/resources/assets/carpet-extra/icon.png" align="right" width="128px"/>
|
||||||
|
|
||||||
|
## carpet-extra
|
||||||
|
|
||||||
|
Mira [carpet-extra](https://github.com/gnembon/carpet-extra/) mod para mas locas y divertidas funcionalidades, incluyendo mesas de crafteo automaticas, dispensers que ponen bloques, hasta trasquilado de pollos!
|
||||||
|
|
||||||
|
## mesa de crafteo automatica
|
||||||
|
|
||||||
|
Debido a problemas de compatibildias con vanilla y otros mods, descarga [mesa de crafteo automatica](https://github.com/gnembon/carpet-autoCraftingTable/releases) por Skyrising como un addon separado para carpet
|
||||||
|
|
||||||
|
## scarpet app store
|
||||||
|
|
||||||
|
Si quieres buscar o contribuir a las app store de scarpet mira las aplicaciones disponibles, ve [aqui](https://github.com/gnembon/scarpet), es gratis!
|
||||||
|
|
||||||
|
## quick-carpet
|
||||||
|
|
||||||
|
Tienes problemas con las snapshots recientes recientes o alguien necesita la version base de carpet?, pero necesita algunas funcionalidades bases de carpet?, checkea la version minima de [quick-carpet](https://github.com/gnembon/quick-carpet/releases). Va a funcionar bien, no vas a poder agregar extensiones o usar apps de scarpet en este por cierto.
|
||||||
|
|
||||||
|
## Otras extensiones hechas por la comunidad para carpet
|
||||||
|
|
||||||
|
Aqui hay una [lista de otras extensiones de carpet](https://github.com/gnembon/fabric-carpet/wiki/List-of-Carpet-extensions) creadas por la comunidad.
|
||||||
|
|
||||||
|
Cualquiera puede crear sus propias opciones de carpeta o extender el lenguaje scarpet con una nueva API, creando una extension de carpet usando esto [extension de carpet plantilla](https://github.com/gnembon/fabric-carpet-extension-example-mod).
|
||||||
|
|
||||||
|
# Como? Que?
|
||||||
|
|
||||||
|
Mira las instrucciones para los mods de carpeta https://fabricmc.net/use/ y pon [carpet...jar](https://github.com/gnembon/fabric-carpet/releases) en la carpeta `mods` junto a los otros mods compatibles.
|
||||||
|
|
||||||
|
Mira la [demostracion de mods](https://www.youtube.com/watch?v=Lt-ooRGpLz4) en youtube para la explicación de cada uno de las opciones y comandos, y checkea la lista de todas las opciones disponibles en la wiki por una lista actualizada de cada opcion.
|
||||||
|
|
||||||
|
# Carpet Mod Settings
|
||||||
|
Mira la lista [Lista de todas las configuraciones disponibles][settings] en la wiki
|
||||||
|
|
||||||
|
[settings]: https://github.com/gnembon/fabric-carpet/wiki/Current-Available-Settings
|
||||||
|
|
||||||
|
Para versiones anteriores de Minecraft: 1.13 checkea [gnembon/carpetmod](https://github.com/gnembon/carpetmod) y para 1.12 checkea [gnembon/carpetmod112](https://github.com/gnembon/carpetmod112).
|
||||||
@@ -9,6 +9,8 @@
|
|||||||
[](https://github.com/gnembon/fabric-carpet/graphs/contributors)
|
[](https://github.com/gnembon/fabric-carpet/graphs/contributors)
|
||||||
[](https://discord.gg/gn99m4QRY4)
|
[](https://discord.gg/gn99m4QRY4)
|
||||||
|
|
||||||
|
Version en español de esta [documentacion](https://github.com/gnembon/fabric-carpet/blob/master/README-ES.md)
|
||||||
|
|
||||||
Cause all carpets are made of fabric?
|
Cause all carpets are made of fabric?
|
||||||
This is the [Fabric](https://fabricmc.net/) version of Carpet Mod, for Minecraft 1.14.X, 1.15.X, 1.16.X and above.
|
This is the [Fabric](https://fabricmc.net/) version of Carpet Mod, for Minecraft 1.14.X, 1.15.X, 1.16.X and above.
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id 'fabric-loom' version '1.6-SNAPSHOT'
|
id 'fabric-loom' version '1.9-SNAPSHOT'
|
||||||
id 'io.github.juuxel.loom-quiltflower' version '1.7.3'
|
id 'io.github.juuxel.loom-quiltflower' version '1.7.3'
|
||||||
id 'maven-publish'
|
id 'maven-publish'
|
||||||
}
|
}
|
||||||
|
|||||||
+19
-13
@@ -2954,7 +2954,7 @@ It returns a `map` with a report indicating how many chunks were affected, and h
|
|||||||
|
|
||||||
Adds a chunk ticket at a position, which makes the game to keep the designated area centered around
|
Adds a chunk ticket at a position, which makes the game to keep the designated area centered around
|
||||||
`pos` with radius of `radius` loaded for a predefined amount of ticks, defined by `type`. Allowed types
|
`pos` with radius of `radius` loaded for a predefined amount of ticks, defined by `type`. Allowed types
|
||||||
are `portal`: 300 ticks, `teleport`: 5 ticks, and `unknown`: 1 tick. Radius can be from 1 to 32 ticks.
|
are `portal`: 300 ticks, `teleport`: 40 ticks, and `unknown`: 1 tick. Radius can be from 1 to 32 ticks.
|
||||||
|
|
||||||
This function is tentative - will likely change when chunk ticket API is properly fleshed out.
|
This function is tentative - will likely change when chunk ticket API is properly fleshed out.
|
||||||
|
|
||||||
@@ -4301,8 +4301,8 @@ Recipe type can take one of the following options:
|
|||||||
* `'smithing'` - smithing table (1.16+)
|
* `'smithing'` - smithing table (1.16+)
|
||||||
|
|
||||||
The return value is a list of available recipes (even if there is only one recipe available). Each recipe contains of
|
The return value is a list of available recipes (even if there is only one recipe available). Each recipe contains of
|
||||||
an item triple of the crafting result, list of ingredients, each containing a list of possible variants of the
|
an item triple of the crafting results as a list of item stacks, list of ingredients, each containing a list of possible variants of the
|
||||||
ingredients in this slot, as item triples, or `null` if its a shaped recipe and a given slot in the patterns is left
|
ingredients in this slot, as item ids, or `null` if it is a shaped recipe and a given slot in the patterns is left
|
||||||
empty, and recipe specification as another list. Possible recipe specs is:
|
empty, and recipe specification as another list. Possible recipe specs is:
|
||||||
* `['shaped', width, height]` - shaped crafting. `width` and `height` can be 1, 2 or 3.
|
* `['shaped', width, height]` - shaped crafting. `width` and `height` can be 1, 2 or 3.
|
||||||
* `['shapeless']` - shapeless crafting
|
* `['shapeless']` - shapeless crafting
|
||||||
@@ -4310,10 +4310,6 @@ Recipe type can take one of the following options:
|
|||||||
* `['cutting']` - stonecutter recipe
|
* `['cutting']` - stonecutter recipe
|
||||||
* `['special']` - special crafting recipe, typically not present in the crafting menu
|
* `['special']` - special crafting recipe, typically not present in the crafting menu
|
||||||
* `['custom']` - other recipe types
|
* `['custom']` - other recipe types
|
||||||
|
|
||||||
Note that ingredients are specified as tripes, with count and nbt information. Currently all recipes require always one
|
|
||||||
of the ingredients, and for some recipes, even if the nbt data for the ingredient is specified (e.g. `dispenser`), it
|
|
||||||
can accept items of any tags.
|
|
||||||
|
|
||||||
Also note that some recipes leave some products in the crafting window, and these can be determined using
|
Also note that some recipes leave some products in the crafting window, and these can be determined using
|
||||||
`crafting_remaining_item()` function
|
`crafting_remaining_item()` function
|
||||||
@@ -4328,7 +4324,7 @@ Also note that some recipes leave some products in the crafting window, and thes
|
|||||||
### `crafting_remaining_item(item)`
|
### `crafting_remaining_item(item)`
|
||||||
|
|
||||||
returns `null` if the item has no remaining item in the crafting window when used as a crafting ingredient, or an
|
returns `null` if the item has no remaining item in the crafting window when used as a crafting ingredient, or an
|
||||||
item name that serves as a replacement after crafting is done. Currently it can only be buckets and glass bottles.
|
item tuple that serves as a replacement after crafting is done. Currently, it can only be buckets and glass bottles.
|
||||||
|
|
||||||
### `inventory_size(inventory)`
|
### `inventory_size(inventory)`
|
||||||
|
|
||||||
@@ -5347,7 +5343,7 @@ clients will actually be able to receive (they may have more available via resou
|
|||||||
Renders a cloud of particles `name` centered around `pos` position, by default `count` 10 of them, default `speed`
|
Renders a cloud of particles `name` centered around `pos` position, by default `count` 10 of them, default `speed`
|
||||||
of 0, and to all players nearby, but these options can be changed via optional arguments. Follow vanilla `/particle`
|
of 0, and to all players nearby, but these options can be changed via optional arguments. Follow vanilla `/particle`
|
||||||
command on details on those options. Valid particle names are
|
command on details on those options. Valid particle names are
|
||||||
for example `'angry_villager', 'item diamond', 'block stone', 'dust 0.8 0.1 0.1 4'`.
|
for example `'angry_villager', 'item diamond', 'block stone', 'dust{"scale": 4, "color": [0.8, 0.1, 0.1]}'`.
|
||||||
|
|
||||||
Used with no arguments, return the list of available particle names. Note that some of the names do not correspond to a valid
|
Used with no arguments, return the list of available particle names. Note that some of the names do not correspond to a valid
|
||||||
particle that can be fed to `particle(...)` function due to a fact that some particles need more configuration
|
particle that can be fed to `particle(...)` function due to a fact that some particles need more configuration
|
||||||
@@ -5735,11 +5731,21 @@ Runs a vanilla command from the string result of the `expr` and returns a triple
|
|||||||
intercepted list of output messages, and error message if the command resulted in a failure.
|
intercepted list of output messages, and error message if the command resulted in a failure.
|
||||||
Successful commands return `null` as their error.
|
Successful commands return `null` as their error.
|
||||||
|
|
||||||
|
The command return `null` if the command was not run immediately, but was scheduled for later execution
|
||||||
|
due to being requested while command was executed. This happens most commonly
|
||||||
|
when running `run` from a `/script run/invoke` command since that always results in piling up command to run while `script` is being executed.
|
||||||
|
|
||||||
|
The mitigation for this is to use `run` in a separate scheduled function, or use `run` in a `tick` event, or literally in
|
||||||
|
any other way than directly from a `/script` command, which will ensure that the command runs immediately.
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
run('fill 1 1 1 10 10 10 air') -> [0, ["Successfully filled 123 blocks"], null]
|
run('fill 1 1 1 10 10 10 air') -> [123, ["Successfully filled 123 blocks"], null]
|
||||||
run('give @s stone 4') -> [0, ["Gave 4 [Stone] to gnembon"], null]
|
run('give @s stone 4') -> [1, ["Gave 4 [Stone] to gnembon"], null]
|
||||||
run('seed') -> [0, ["Seed: [4031384495743822299]"], null]
|
run('seed') -> [-170661413, [Seed: [4031384495743822299]], null]
|
||||||
run('sed') -> [0, [], "sed<--[HERE]"] // wrong command
|
run('sed') -> [-1, [], "sed<--[HERE]"] // wrong command
|
||||||
|
|
||||||
|
/script run run('setblock 0 0 0 stone') -> null
|
||||||
|
/script run schedule(0, _() -> print(run('setblock 0 0 0 stone'))) -> [1, [Changed the block at 0, 0, 0], null]
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
### `save()`
|
### `save()`
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ clients will actually be able to receive (they may have more available via resou
|
|||||||
Renders a cloud of particles `name` centered around `pos` position, by default `count` 10 of them, default `speed`
|
Renders a cloud of particles `name` centered around `pos` position, by default `count` 10 of them, default `speed`
|
||||||
of 0, and to all players nearby, but these options can be changed via optional arguments. Follow vanilla `/particle`
|
of 0, and to all players nearby, but these options can be changed via optional arguments. Follow vanilla `/particle`
|
||||||
command on details on those options. Valid particle names are
|
command on details on those options. Valid particle names are
|
||||||
for example `'angry_villager', 'item diamond', 'block stone', 'dust 0.8 0.1 0.1 4'`.
|
for example `'angry_villager', 'item diamond', 'block stone', 'dust{"scale": 4, "color": [0.8, 0.1, 0.1]}'`.
|
||||||
|
|
||||||
Used with no arguments, return the list of available particle names. Note that some of the names do not correspond to a valid
|
Used with no arguments, return the list of available particle names. Note that some of the names do not correspond to a valid
|
||||||
particle that can be fed to `particle(...)` function due to a fact that some particles need more configuration
|
particle that can be fed to `particle(...)` function due to a fact that some particles need more configuration
|
||||||
@@ -410,11 +410,21 @@ Runs a vanilla command from the string result of the `expr` and returns a triple
|
|||||||
intercepted list of output messages, and error message if the command resulted in a failure.
|
intercepted list of output messages, and error message if the command resulted in a failure.
|
||||||
Successful commands return `null` as their error.
|
Successful commands return `null` as their error.
|
||||||
|
|
||||||
|
The command return `null` if the command was not run immediately, but was scheduled for later execution
|
||||||
|
due to being requested while command was executed. This happens most commonly
|
||||||
|
when running `run` from a `/script run/invoke` command since that always results in piling up command to run while `script` is being executed.
|
||||||
|
|
||||||
|
The mitigation for this is to use `run` in a separate scheduled function, or use `run` in a `tick` event, or literally in
|
||||||
|
any other way than directly from a `/script` command, which will ensure that the command runs immediately.
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
run('fill 1 1 1 10 10 10 air') -> [0, ["Successfully filled 123 blocks"], null]
|
run('fill 1 1 1 10 10 10 air') -> [123, ["Successfully filled 123 blocks"], null]
|
||||||
run('give @s stone 4') -> [0, ["Gave 4 [Stone] to gnembon"], null]
|
run('give @s stone 4') -> [1, ["Gave 4 [Stone] to gnembon"], null]
|
||||||
run('seed') -> [0, ["Seed: [4031384495743822299]"], null]
|
run('seed') -> [-170661413, [Seed: [4031384495743822299]], null]
|
||||||
run('sed') -> [0, [], "sed<--[HERE]"] // wrong command
|
run('sed') -> [-1, [], "sed<--[HERE]"] // wrong command
|
||||||
|
|
||||||
|
/script run run('setblock 0 0 0 stone') -> null
|
||||||
|
/script run schedule(0, _() -> print(run('setblock 0 0 0 stone'))) -> [1, [Changed the block at 0, 0, 0], null]
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
### `save()`
|
### `save()`
|
||||||
|
|||||||
@@ -625,7 +625,7 @@ It returns a `map` with a report indicating how many chunks were affected, and h
|
|||||||
|
|
||||||
Adds a chunk ticket at a position, which makes the game to keep the designated area centered around
|
Adds a chunk ticket at a position, which makes the game to keep the designated area centered around
|
||||||
`pos` with radius of `radius` loaded for a predefined amount of ticks, defined by `type`. Allowed types
|
`pos` with radius of `radius` loaded for a predefined amount of ticks, defined by `type`. Allowed types
|
||||||
are `portal`: 300 ticks, `teleport`: 5 ticks, and `unknown`: 1 tick. Radius can be from 1 to 32 ticks.
|
are `portal`: 300 ticks, `teleport`: 40 ticks, and `unknown`: 1 tick. Radius can be from 1 to 32 ticks.
|
||||||
|
|
||||||
This function is tentative - will likely change when chunk ticket API is properly fleshed out.
|
This function is tentative - will likely change when chunk ticket API is properly fleshed out.
|
||||||
|
|
||||||
|
|||||||
@@ -70,8 +70,8 @@ Recipe type can take one of the following options:
|
|||||||
* `'smithing'` - smithing table (1.16+)
|
* `'smithing'` - smithing table (1.16+)
|
||||||
|
|
||||||
The return value is a list of available recipes (even if there is only one recipe available). Each recipe contains of
|
The return value is a list of available recipes (even if there is only one recipe available). Each recipe contains of
|
||||||
an item triple of the crafting result, list of ingredients, each containing a list of possible variants of the
|
an item triple of the crafting results as a list of item stacks, list of ingredients, each containing a list of possible variants of the
|
||||||
ingredients in this slot, as item triples, or `null` if its a shaped recipe and a given slot in the patterns is left
|
ingredients in this slot, as item ids, or `null` if it is a shaped recipe and a given slot in the patterns is left
|
||||||
empty, and recipe specification as another list. Possible recipe specs is:
|
empty, and recipe specification as another list. Possible recipe specs is:
|
||||||
* `['shaped', width, height]` - shaped crafting. `width` and `height` can be 1, 2 or 3.
|
* `['shaped', width, height]` - shaped crafting. `width` and `height` can be 1, 2 or 3.
|
||||||
* `['shapeless']` - shapeless crafting
|
* `['shapeless']` - shapeless crafting
|
||||||
@@ -79,10 +79,6 @@ Recipe type can take one of the following options:
|
|||||||
* `['cutting']` - stonecutter recipe
|
* `['cutting']` - stonecutter recipe
|
||||||
* `['special']` - special crafting recipe, typically not present in the crafting menu
|
* `['special']` - special crafting recipe, typically not present in the crafting menu
|
||||||
* `['custom']` - other recipe types
|
* `['custom']` - other recipe types
|
||||||
|
|
||||||
Note that ingredients are specified as tripes, with count and nbt information. Currently all recipes require always one
|
|
||||||
of the ingredients, and for some recipes, even if the nbt data for the ingredient is specified (e.g. `dispenser`), it
|
|
||||||
can accept items of any tags.
|
|
||||||
|
|
||||||
Also note that some recipes leave some products in the crafting window, and these can be determined using
|
Also note that some recipes leave some products in the crafting window, and these can be determined using
|
||||||
`crafting_remaining_item()` function
|
`crafting_remaining_item()` function
|
||||||
@@ -97,7 +93,7 @@ Also note that some recipes leave some products in the crafting window, and thes
|
|||||||
### `crafting_remaining_item(item)`
|
### `crafting_remaining_item(item)`
|
||||||
|
|
||||||
returns `null` if the item has no remaining item in the crafting window when used as a crafting ingredient, or an
|
returns `null` if the item has no remaining item in the crafting window when used as a crafting ingredient, or an
|
||||||
item name that serves as a replacement after crafting is done. Currently it can only be buckets and glass bottles.
|
item tuple that serves as a replacement after crafting is done. Currently, it can only be buckets and glass bottles.
|
||||||
|
|
||||||
### `inventory_size(inventory)`
|
### `inventory_size(inventory)`
|
||||||
|
|
||||||
|
|||||||
+6
-6
@@ -3,13 +3,13 @@ org.gradle.jvmargs=-Xmx1G
|
|||||||
|
|
||||||
# Fabric Properties
|
# Fabric Properties
|
||||||
# check https://fabricmc.net/develop/
|
# check https://fabricmc.net/develop/
|
||||||
minecraft_version=1.21.1
|
minecraft_version=1.21.8
|
||||||
loader_version=0.15.11
|
loader_version=0.16.14
|
||||||
jsr305_version=3.0.2
|
jsr305_version=3.0.2
|
||||||
fabric_version=0.99.2+1.21
|
fabric_version=0.119.5+1.21.5
|
||||||
|
|
||||||
# Mod Properties
|
# Mod Properties
|
||||||
mod_version = 1.4.147
|
mod_version = 1.4.177
|
||||||
maven_group = carpet
|
maven_group = carpet
|
||||||
archives_base_name = fabric-carpet
|
archives_base_name = fabric-carpet
|
||||||
|
|
||||||
@@ -17,7 +17,7 @@ org.gradle.jvmargs=-Xmx1G
|
|||||||
# The Curseforge versions "names" or ids for the main branch (comma separated: 1.16.4,1.16.5)
|
# The Curseforge versions "names" or ids for the main branch (comma separated: 1.16.4,1.16.5)
|
||||||
# This is needed because CF uses too vague names for prereleases and release candidates
|
# This is needed because CF uses too vague names for prereleases and release candidates
|
||||||
# Can also be the version ID directly coming from https://minecraft.curseforge.com/api/game/versions?token=[API_TOKEN]
|
# Can also be the version ID directly coming from https://minecraft.curseforge.com/api/game/versions?token=[API_TOKEN]
|
||||||
release-curse-versions = Minecraft 1.21.1:1.21.1
|
release-curse-versions = Minecraft 1.21:1.21.7
|
||||||
# Whether or not to build another branch on release
|
# Whether or not to build another branch on release
|
||||||
release-extra-branch = false
|
release-extra-branch = false
|
||||||
# The name of the second branch to release
|
# The name of the second branch to release
|
||||||
@@ -25,4 +25,4 @@ org.gradle.jvmargs=-Xmx1G
|
|||||||
# The "name" or id of the Curseforge version for the secondary branch
|
# The "name" or id of the Curseforge version for the secondary branch
|
||||||
# This is needed because CF uses too vague names for snapshots
|
# This is needed because CF uses too vague names for snapshots
|
||||||
# Can also be the version ID directly coming from https://minecraft.curseforge.com/api/game/versions?token=[API_TOKEN]
|
# Can also be the version ID directly coming from https://minecraft.curseforge.com/api/game/versions?token=[API_TOKEN]
|
||||||
release-extra-curse-version = Minecraft 1.20:1.20.4-Snapshot
|
release-extra-curse-version = Minecraft 1.20:1.20.4-Snapshot
|
||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
@@ -40,6 +40,8 @@ import net.minecraft.server.MinecraftServer;
|
|||||||
import net.minecraft.server.commands.PerfCommand;
|
import net.minecraft.server.commands.PerfCommand;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
public class CarpetServer // static for now - easier to handle all around the code, its one anyways
|
public class CarpetServer // static for now - easier to handle all around the code, its one anyways
|
||||||
{
|
{
|
||||||
public static MinecraftServer minecraft_server;
|
public static MinecraftServer minecraft_server;
|
||||||
@@ -172,7 +174,7 @@ public class CarpetServer // static for now - easier to handle all around the co
|
|||||||
scriptServer = null;
|
scriptServer = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void onServerClosed(MinecraftServer server)
|
public static void onServerClosed(@Nullable MinecraftServer server)
|
||||||
{
|
{
|
||||||
// this for whatever reason gets called multiple times even when joining on SP
|
// this for whatever reason gets called multiple times even when joining on SP
|
||||||
// so we allow to pass multiple times gating it only on existing server ref
|
// so we allow to pass multiple times gating it only on existing server ref
|
||||||
@@ -180,7 +182,7 @@ public class CarpetServer // static for now - easier to handle all around the co
|
|||||||
{
|
{
|
||||||
if (scriptServer != null) scriptServer.onClose();
|
if (scriptServer != null) scriptServer.onClose();
|
||||||
// this is a mess, will cleanip onlly when global reference is gone
|
// this is a mess, will cleanip onlly when global reference is gone
|
||||||
if (!Vanilla.MinecraftServer_getScriptServer(server).stopAll) {
|
if (server != null && !Vanilla.MinecraftServer_getScriptServer(server).stopAll) {
|
||||||
Vanilla.MinecraftServer_getScriptServer(server).onClose();
|
Vanilla.MinecraftServer_getScriptServer(server).onClose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ public class CarpetSettings
|
|||||||
@Rule(
|
@Rule(
|
||||||
desc = "Sets the language for Carpet",
|
desc = "Sets the language for Carpet",
|
||||||
category = FEATURE,
|
category = FEATURE,
|
||||||
options = {"en_us", "fr_fr", "pt_br", "zh_cn", "zh_tw"},
|
options = {"en_us", "fr_fr", "es_ar","pt_br", "zh_cn", "zh_tw"},
|
||||||
strict = true, // the current system doesn't handle fallbacks and other, not defined languages would make unreadable mess. Change later
|
strict = true, // the current system doesn't handle fallbacks and other, not defined languages would make unreadable mess. Change later
|
||||||
validate = LanguageValidator.class
|
validate = LanguageValidator.class
|
||||||
)
|
)
|
||||||
@@ -908,7 +908,7 @@ public class CarpetSettings
|
|||||||
@Override
|
@Override
|
||||||
public String validate(CommandSourceStack source, CarpetRule<String> currentRule, String newValue, String string) {
|
public String validate(CommandSourceStack source, CarpetRule<String> currentRule, String newValue, String string) {
|
||||||
if (source == null) return newValue; // closing or sync
|
if (source == null) return newValue; // closing or sync
|
||||||
Optional<Block> ignoredBlock = source.registryAccess().registryOrThrow(Registries.BLOCK).getOptional(ResourceLocation.tryParse(newValue));
|
Optional<Block> ignoredBlock = source.registryAccess().lookupOrThrow(Registries.BLOCK).getOptional(ResourceLocation.tryParse(newValue));
|
||||||
if (!ignoredBlock.isPresent()) {
|
if (!ignoredBlock.isPresent()) {
|
||||||
Messenger.m(source, "r Unknown block '" + newValue + "'.");
|
Messenger.m(source, "r Unknown block '" + newValue + "'.");
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import java.util.function.Predicate;
|
|||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import carpet.script.Expression;
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
import com.mojang.brigadier.CommandDispatcher;
|
import com.mojang.brigadier.CommandDispatcher;
|
||||||
import com.mojang.brigadier.arguments.StringArgumentType;
|
import com.mojang.brigadier.arguments.StringArgumentType;
|
||||||
@@ -304,7 +305,7 @@ public class SettingsManager {
|
|||||||
/**
|
/**
|
||||||
* Calling this method is not supported.
|
* Calling this method is not supported.
|
||||||
*/
|
*/
|
||||||
public void inspectClientsideCommand(CommandSourceStack source, String string)
|
public void inspectClientsideCommand(String string)
|
||||||
{
|
{
|
||||||
if (string.startsWith("/" + identifier + " "))
|
if (string.startsWith("/" + identifier + " "))
|
||||||
{
|
{
|
||||||
@@ -316,9 +317,9 @@ public class SettingsManager {
|
|||||||
if (rules.containsKey(rule) && rules.get(rule).canBeToggledClientSide())
|
if (rules.containsKey(rule) && rules.get(rule).canBeToggledClientSide())
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
rules.get(rule).set(source, strOption);
|
rules.get(rule).set(null, strOption);
|
||||||
} catch (InvalidRuleValueException e) {
|
} catch (InvalidRuleValueException e) {
|
||||||
e.notifySource(rule, source);
|
//e.notifySource(rule, source);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -331,7 +332,7 @@ public class SettingsManager {
|
|||||||
{
|
{
|
||||||
if (RuleHelper.getBooleanValue(rule) || (rule.type() == String.class && !rule.value().equals("false")))
|
if (RuleHelper.getBooleanValue(rule) || (rule.type() == String.class && !rule.value().equals("false")))
|
||||||
{
|
{
|
||||||
CarpetServer.scriptServer.addScriptHost(source, rule.scarpetApp, s -> CommandHelper.canUseCommand(s, rule.value()), false, false, true, null);
|
CarpetServer.scriptServer.addScriptHost(source, rule.scarpetApp, s -> CommandHelper.canUseCommand(s, rule.value()), false, false, true, null, Expression.LoadOverride.DEFAULT);
|
||||||
} else {
|
} else {
|
||||||
CarpetServer.scriptServer.removeScriptHost(source, rule.scarpetApp, false, true);
|
CarpetServer.scriptServer.removeScriptHost(source, rule.scarpetApp, false, true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -241,7 +241,7 @@ public class DrawCommand
|
|||||||
}
|
}
|
||||||
if (CarpetSettings.fillUpdates)
|
if (CarpetSettings.fillUpdates)
|
||||||
{
|
{
|
||||||
list.forEach(blockpos1 -> world.blockUpdated(blockpos1, world.getBlockState(blockpos1).getBlock()));
|
list.forEach(blockpos1 -> world.updateNeighborsAt(blockpos1, world.getBlockState(blockpos1).getBlock()));
|
||||||
}
|
}
|
||||||
Messenger.m(ctx.getSource(), "gi Filled " + affected + " blocks");
|
Messenger.m(ctx.getSource(), "gi Filled " + affected + " blocks");
|
||||||
return affected;
|
return affected;
|
||||||
@@ -291,7 +291,7 @@ public class DrawCommand
|
|||||||
|
|
||||||
if (CarpetSettings.fillUpdates)
|
if (CarpetSettings.fillUpdates)
|
||||||
{
|
{
|
||||||
list.forEach(p -> world.blockUpdated(p, world.getBlockState(p).getBlock()));
|
list.forEach(p -> world.updateNeighborsAt(p, world.getBlockState(p).getBlock()));
|
||||||
}
|
}
|
||||||
|
|
||||||
Messenger.m(source, "gi Filled " + affected + " blocks");
|
Messenger.m(source, "gi Filled " + affected + " blocks");
|
||||||
@@ -390,7 +390,7 @@ public class DrawCommand
|
|||||||
|
|
||||||
for (BlockPos blockpos1 : list) {
|
for (BlockPos blockpos1 : list) {
|
||||||
Block blokc = world.getBlockState(blockpos1).getBlock();
|
Block blokc = world.getBlockState(blockpos1).getBlock();
|
||||||
world.blockUpdated(blockpos1, blokc);
|
world.updateNeighborsAt(blockpos1, blokc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -441,7 +441,7 @@ public class DrawCommand
|
|||||||
|
|
||||||
for (BlockPos blockpos1 : list) {
|
for (BlockPos blockpos1 : list) {
|
||||||
Block blokc = world.getBlockState(blockpos1).getBlock();
|
Block blokc = world.getBlockState(blockpos1).getBlock();
|
||||||
world.blockUpdated(blockpos1, blokc);
|
world.updateNeighborsAt(blockpos1, blokc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import net.minecraft.core.BlockPos;
|
|||||||
import net.minecraft.core.registries.Registries;
|
import net.minecraft.core.registries.Registries;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
|
import net.minecraft.world.entity.EntitySpawnReason;
|
||||||
import net.minecraft.world.entity.EntityType;
|
import net.minecraft.world.entity.EntityType;
|
||||||
import net.minecraft.world.entity.Mob;
|
import net.minecraft.world.entity.Mob;
|
||||||
|
|
||||||
@@ -39,7 +40,7 @@ public class PerimeterInfoCommand
|
|||||||
BlockPosArgument.getSpawnablePos(c, "center position"),
|
BlockPosArgument.getSpawnablePos(c, "center position"),
|
||||||
null)).
|
null)).
|
||||||
then(argument("mob", resource(commandBuildContext, Registries.ENTITY_TYPE)).
|
then(argument("mob", resource(commandBuildContext, Registries.ENTITY_TYPE)).
|
||||||
suggests(SuggestionProviders.SUMMONABLE_ENTITIES).
|
suggests(SuggestionProviders.cast(SuggestionProviders.SUMMONABLE_ENTITIES)).
|
||||||
executes( (c) -> perimeterDiagnose(
|
executes( (c) -> perimeterDiagnose(
|
||||||
c.getSource(),
|
c.getSource(),
|
||||||
BlockPosArgument.getSpawnablePos(c, "center position"),
|
BlockPosArgument.getSpawnablePos(c, "center position"),
|
||||||
@@ -55,8 +56,8 @@ public class PerimeterInfoCommand
|
|||||||
if (mobId != null)
|
if (mobId != null)
|
||||||
{
|
{
|
||||||
nbttagcompound.putString("id", mobId);
|
nbttagcompound.putString("id", mobId);
|
||||||
Entity baseEntity = EntityType.loadEntityRecursive(nbttagcompound, source.getLevel(), (entity_1x) -> {
|
Entity baseEntity = EntityType.loadEntityRecursive(nbttagcompound, source.getLevel(), EntitySpawnReason.COMMAND, (entity_1x) -> {
|
||||||
entity_1x.moveTo(new BlockPos(pos.getX(), source.getLevel().getMinBuildHeight()-10, pos.getZ()), entity_1x.getYRot(), entity_1x. getXRot());
|
entity_1x.snapTo(new BlockPos(pos.getX(), source.getLevel().getMinY()-10, pos.getZ()), entity_1x.getYRot(), entity_1x. getXRot());
|
||||||
return !source.getLevel().addWithUUID(entity_1x) ? null : entity_1x;
|
return !source.getLevel().addWithUUID(entity_1x) ? null : entity_1x;
|
||||||
});
|
});
|
||||||
if (!(baseEntity instanceof Mob))
|
if (!(baseEntity instanceof Mob))
|
||||||
|
|||||||
@@ -181,7 +181,13 @@ public class PlayerCommand {
|
|||||||
MinecraftServer server = context.getSource().getServer();
|
MinecraftServer server = context.getSource().getServer();
|
||||||
PlayerList manager = server.getPlayerList();
|
PlayerList manager = server.getPlayerList();
|
||||||
|
|
||||||
if (manager.getPlayerByName(playerName) != null) {
|
if (EntityPlayerMPFake.isSpawningPlayer(playerName))
|
||||||
|
{
|
||||||
|
Messenger.m(context.getSource(), "r Player ", "rb " + playerName, "r is currently logging on");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (manager.getPlayerByName(playerName) != null)
|
||||||
|
{
|
||||||
Messenger.m(context.getSource(), "r Player ", "rb " + playerName, "r is already logged on");
|
Messenger.m(context.getSource(), "r Player ", "rb " + playerName, "r is already logged on");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -215,7 +221,8 @@ public class PlayerCommand {
|
|||||||
|
|
||||||
private static int kill(CommandContext<CommandSourceStack> context) {
|
private static int kill(CommandContext<CommandSourceStack> context) {
|
||||||
if (cantReMove(context)) return 0;
|
if (cantReMove(context)) return 0;
|
||||||
getPlayer(context).kill();
|
ServerPlayer player = getPlayer(context);
|
||||||
|
player.kill(player.level());
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -314,7 +321,7 @@ public class PlayerCommand {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
EntityPlayerMPFake.createShadow(player.server, player);
|
EntityPlayerMPFake.createShadow(player.getServer(), player);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
package carpet.fakes;
|
|
||||||
|
|
||||||
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
|
|
||||||
import net.minecraft.server.level.ChunkHolder;
|
|
||||||
import net.minecraft.server.level.Ticket;
|
|
||||||
import net.minecraft.util.SortedArraySet;
|
|
||||||
import net.minecraft.world.level.ChunkPos;
|
|
||||||
|
|
||||||
public interface ChunkTicketManagerInterface
|
|
||||||
{
|
|
||||||
void changeSpawnChunks(ChunkPos pos, int distance);
|
|
||||||
|
|
||||||
Long2ObjectOpenHashMap<SortedArraySet<Ticket<?>>> getTicketsByPosition();
|
|
||||||
|
|
||||||
void replaceHolder(ChunkHolder oldHolder, ChunkHolder newHolder);
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package carpet.fakes;
|
||||||
|
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.world.level.Level;
|
||||||
|
|
||||||
|
|
||||||
|
public interface DefaultRedstoneWireEvaluatorInferface
|
||||||
|
{
|
||||||
|
int calculateTargetStrengthCM(final Level level, final BlockPos pos);
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package carpet.fakes;
|
||||||
|
|
||||||
|
public interface FoodDataInterface
|
||||||
|
{
|
||||||
|
float getCMExhaustionLevel();
|
||||||
|
|
||||||
|
void setExhaustion(float aFloat);
|
||||||
|
}
|
||||||
@@ -10,5 +10,5 @@ public interface IngredientInterface
|
|||||||
* Gets all the stacks of the ingredients for a given item recipe. Also used for {@link carpet.helpers.HopperCounter#guessColor}
|
* Gets all the stacks of the ingredients for a given item recipe. Also used for {@link carpet.helpers.HopperCounter#guessColor}
|
||||||
* to guess the colour of an item to display it prettily
|
* to guess the colour of an item to display it prettily
|
||||||
*/
|
*/
|
||||||
List<Collection<ItemStack>> getRecipeStacks();
|
//List<Collection<ItemStack>> getRecipeStacks();
|
||||||
}
|
}
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
package carpet.fakes;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import net.minecraft.core.RegistryAccess;
|
|
||||||
import net.minecraft.resources.ResourceLocation;
|
|
||||||
import net.minecraft.world.item.crafting.Recipe;
|
|
||||||
import net.minecraft.world.item.crafting.RecipeType;
|
|
||||||
|
|
||||||
public interface RecipeManagerInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Gets all the recipes for a given item. Also used for {@link carpet.helpers.HopperCounter#guessColor} to guess the
|
|
||||||
* colour of an item to display it prettily
|
|
||||||
*/
|
|
||||||
List<Recipe<?>> getAllMatching(final RecipeType<?> type, final ResourceLocation itemId, final RegistryAccess registryAccess);
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package carpet.fakes;
|
||||||
|
|
||||||
|
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
|
||||||
|
import net.minecraft.server.level.Ticket;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface TicketsFetcherInterface
|
||||||
|
{
|
||||||
|
Long2ObjectOpenHashMap<List<Ticket>> getTicketsByPosition();
|
||||||
|
}
|
||||||
@@ -6,5 +6,5 @@ import net.minecraft.world.level.block.state.BlockState;
|
|||||||
|
|
||||||
public interface WorldChunkInterface
|
public interface WorldChunkInterface
|
||||||
{
|
{
|
||||||
BlockState setBlockStateWithBlockEntity(BlockPos blockPos, BlockState newBlockState, BlockEntity newBlockEntity, boolean boolean1);
|
BlockState setBlockStateWithBlockEntity(BlockPos blockPos, BlockState newBlockState, BlockEntity newBlockEntity, int flags);
|
||||||
}
|
}
|
||||||
@@ -100,7 +100,7 @@ public class BlockRotator
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Send block update to the block that just have been rotated.
|
// Send block update to the block that just have been rotated.
|
||||||
world.neighborChanged(blockpos, block, source.pos());
|
world.neighborChanged(blockpos, block, null);
|
||||||
|
|
||||||
return stack;
|
return stack;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import carpet.script.utils.Tracer;
|
|||||||
import net.minecraft.commands.arguments.EntityAnchorArgument;
|
import net.minecraft.commands.arguments.EntityAnchorArgument;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.core.Direction;
|
import net.minecraft.core.Direction;
|
||||||
import net.minecraft.network.protocol.game.ClientboundSetCarriedItemPacket;
|
import net.minecraft.network.protocol.game.ClientboundSetHeldSlotPacket;
|
||||||
import net.minecraft.network.protocol.game.ServerboundPlayerActionPacket;
|
import net.minecraft.network.protocol.game.ServerboundPlayerActionPacket;
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
@@ -274,15 +274,15 @@ public class EntityPlayerActionPack
|
|||||||
else // one slot
|
else // one slot
|
||||||
{
|
{
|
||||||
if (selectedSlot == -1)
|
if (selectedSlot == -1)
|
||||||
selectedSlot = inv.selected;
|
selectedSlot = inv.getSelectedSlot();
|
||||||
dropItemFromSlot(selectedSlot, dropAll);
|
dropItemFromSlot(selectedSlot, dropAll);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSlot(int slot)
|
public void setSlot(int slot)
|
||||||
{
|
{
|
||||||
player.getInventory().selected = slot-1;
|
player.getInventory().setSelectedSlot(slot-1);
|
||||||
player.connection.send(new ClientboundSetCarriedItemPacket(slot-1));
|
player.connection.send(new ClientboundSetHeldSlotPacket(slot-1));
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum ActionType
|
public enum ActionType
|
||||||
@@ -310,16 +310,16 @@ public class EntityPlayerActionPack
|
|||||||
case BLOCK:
|
case BLOCK:
|
||||||
{
|
{
|
||||||
player.resetLastActionTime();
|
player.resetLastActionTime();
|
||||||
ServerLevel world = player.serverLevel();
|
ServerLevel world = player.level();
|
||||||
BlockHitResult blockHit = (BlockHitResult) hit;
|
BlockHitResult blockHit = (BlockHitResult) hit;
|
||||||
BlockPos pos = blockHit.getBlockPos();
|
BlockPos pos = blockHit.getBlockPos();
|
||||||
Direction side = blockHit.getDirection();
|
Direction side = blockHit.getDirection();
|
||||||
if (pos.getY() < player.level().getMaxBuildHeight() - (side == Direction.UP ? 1 : 0) && world.mayInteract(player, pos))
|
if (pos.getY() < player.level().getMaxY() - (side == Direction.UP ? 1 : 0) && world.mayInteract(player, pos))
|
||||||
{
|
{
|
||||||
InteractionResult result = player.gameMode.useItemOn(player, world, player.getItemInHand(hand), hand, blockHit);
|
InteractionResult result = player.gameMode.useItemOn(player, world, player.getItemInHand(hand), hand, blockHit);
|
||||||
if (result.consumesAction())
|
if (result instanceof InteractionResult.Success success)
|
||||||
{
|
{
|
||||||
if (result.shouldSwing()) player.swing(hand);
|
if (success.swingSource() == InteractionResult.SwingSource.SERVER) player.swing(hand);
|
||||||
ap.itemUseCooldown = 3;
|
ap.itemUseCooldown = 3;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -402,7 +402,7 @@ public class EntityPlayerActionPack
|
|||||||
boolean blockBroken = false;
|
boolean blockBroken = false;
|
||||||
if (player.gameMode.getGameModeForPlayer().isCreative())
|
if (player.gameMode.getGameModeForPlayer().isCreative())
|
||||||
{
|
{
|
||||||
player.gameMode.handleBlockBreakAction(pos, ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK, side, player.level().getMaxBuildHeight(), -1);
|
player.gameMode.handleBlockBreakAction(pos, ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK, side, player.level().getMaxY(), -1);
|
||||||
ap.blockHitDelay = 5;
|
ap.blockHitDelay = 5;
|
||||||
blockBroken = true;
|
blockBroken = true;
|
||||||
}
|
}
|
||||||
@@ -410,9 +410,9 @@ public class EntityPlayerActionPack
|
|||||||
{
|
{
|
||||||
if (ap.currentBlock != null)
|
if (ap.currentBlock != null)
|
||||||
{
|
{
|
||||||
player.gameMode.handleBlockBreakAction(ap.currentBlock, ServerboundPlayerActionPacket.Action.ABORT_DESTROY_BLOCK, side, player.level().getMaxBuildHeight(), -1);
|
player.gameMode.handleBlockBreakAction(ap.currentBlock, ServerboundPlayerActionPacket.Action.ABORT_DESTROY_BLOCK, side, player.level().getMaxY(), -1);
|
||||||
}
|
}
|
||||||
player.gameMode.handleBlockBreakAction(pos, ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK, side, player.level().getMaxBuildHeight(), -1);
|
player.gameMode.handleBlockBreakAction(pos, ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK, side, player.level().getMaxY(), -1);
|
||||||
boolean notAir = !state.isAir();
|
boolean notAir = !state.isAir();
|
||||||
if (notAir && ap.curBlockDamageMP == 0)
|
if (notAir && ap.curBlockDamageMP == 0)
|
||||||
{
|
{
|
||||||
@@ -435,7 +435,7 @@ public class EntityPlayerActionPack
|
|||||||
ap.curBlockDamageMP += state.getDestroyProgress(player, player.level(), pos);
|
ap.curBlockDamageMP += state.getDestroyProgress(player, player.level(), pos);
|
||||||
if (ap.curBlockDamageMP >= 1)
|
if (ap.curBlockDamageMP >= 1)
|
||||||
{
|
{
|
||||||
player.gameMode.handleBlockBreakAction(pos, ServerboundPlayerActionPacket.Action.STOP_DESTROY_BLOCK, side, player.level().getMaxBuildHeight(), -1);
|
player.gameMode.handleBlockBreakAction(pos, ServerboundPlayerActionPacket.Action.STOP_DESTROY_BLOCK, side, player.level().getMaxY(), -1);
|
||||||
ap.currentBlock = null;
|
ap.currentBlock = null;
|
||||||
ap.blockHitDelay = 5;
|
ap.blockHitDelay = 5;
|
||||||
blockBroken = true;
|
blockBroken = true;
|
||||||
@@ -457,7 +457,7 @@ public class EntityPlayerActionPack
|
|||||||
EntityPlayerActionPack ap = ((ServerPlayerInterface) player).getActionPack();
|
EntityPlayerActionPack ap = ((ServerPlayerInterface) player).getActionPack();
|
||||||
if (ap.currentBlock == null) return;
|
if (ap.currentBlock == null) return;
|
||||||
player.level().destroyBlockProgress(-1, ap.currentBlock, -1);
|
player.level().destroyBlockProgress(-1, ap.currentBlock, -1);
|
||||||
player.gameMode.handleBlockBreakAction(ap.currentBlock, ServerboundPlayerActionPacket.Action.ABORT_DESTROY_BLOCK, Direction.DOWN, player.level().getMaxBuildHeight(), -1);
|
player.gameMode.handleBlockBreakAction(ap.currentBlock, ServerboundPlayerActionPacket.Action.ABORT_DESTROY_BLOCK, Direction.DOWN, player.level().getMaxY(), -1);
|
||||||
ap.currentBlock = null;
|
ap.currentBlock = null;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ public interface FertilizableCoral extends BonemealableBlock {
|
|||||||
|
|
||||||
MapColor color = blockUnder.getMapColor(worldIn, pos);
|
MapColor color = blockUnder.getMapColor(worldIn, pos);
|
||||||
BlockState properBlock = blockUnder;
|
BlockState properBlock = blockUnder;
|
||||||
HolderSet.Named<Block> coralBlocks = worldIn.registryAccess().registryOrThrow(Registries.BLOCK).getTag(BlockTags.CORAL_BLOCKS).orElseThrow();
|
HolderSet.Named<Block> coralBlocks = worldIn.registryAccess().lookupOrThrow(Registries.BLOCK).get(BlockTags.CORAL_BLOCKS).orElseThrow();
|
||||||
for (Holder<Block> block: coralBlocks)
|
for (Holder<Block> block: coralBlocks)
|
||||||
{
|
{
|
||||||
properBlock = block.value().defaultBlockState();
|
properBlock = block.value().defaultBlockState();
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
package carpet.helpers;
|
package carpet.helpers;
|
||||||
|
|
||||||
import carpet.CarpetServer;
|
import carpet.CarpetServer;
|
||||||
import carpet.fakes.IngredientInterface;
|
import carpet.script.utils.RecipeHelper;
|
||||||
import carpet.fakes.RecipeManagerInterface;
|
|
||||||
import carpet.utils.Messenger;
|
import carpet.utils.Messenger;
|
||||||
import it.unimi.dsi.fastutil.objects.Object2LongLinkedOpenHashMap;
|
import it.unimi.dsi.fastutil.objects.Object2LongLinkedOpenHashMap;
|
||||||
import it.unimi.dsi.fastutil.objects.Object2LongMap;
|
import it.unimi.dsi.fastutil.objects.Object2LongMap;
|
||||||
import net.minecraft.ChatFormatting;
|
import net.minecraft.ChatFormatting;
|
||||||
|
import net.minecraft.core.Holder;
|
||||||
import net.minecraft.core.Registry;
|
import net.minecraft.core.Registry;
|
||||||
import net.minecraft.core.RegistryAccess;
|
import net.minecraft.core.RegistryAccess;
|
||||||
import net.minecraft.core.registries.Registries;
|
import net.minecraft.core.registries.Registries;
|
||||||
@@ -24,7 +24,7 @@ import net.minecraft.world.item.ItemStack;
|
|||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.item.crafting.Ingredient;
|
import net.minecraft.world.item.crafting.Ingredient;
|
||||||
import net.minecraft.world.item.crafting.Recipe;
|
import net.minecraft.world.item.crafting.Recipe;
|
||||||
import net.minecraft.world.item.crafting.RecipeType;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.block.AbstractBannerBlock;
|
import net.minecraft.world.level.block.AbstractBannerBlock;
|
||||||
import net.minecraft.world.level.block.BeaconBeamBlock;
|
import net.minecraft.world.level.block.BeaconBeamBlock;
|
||||||
import net.minecraft.world.level.block.Block;
|
import net.minecraft.world.level.block.Block;
|
||||||
@@ -32,12 +32,12 @@ import net.minecraft.world.level.block.Blocks;
|
|||||||
import net.minecraft.world.level.material.MapColor;
|
import net.minecraft.world.level.material.MapColor;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.EnumMap;
|
import java.util.EnumMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static java.util.Map.entry;
|
import static java.util.Map.entry;
|
||||||
@@ -102,7 +102,9 @@ public class HopperCounter
|
|||||||
this.color = color;
|
this.color = color;
|
||||||
String hexColor = Integer.toHexString(color.getTextColor());
|
String hexColor = Integer.toHexString(color.getTextColor());
|
||||||
if (hexColor.length() < 6)
|
if (hexColor.length() < 6)
|
||||||
|
{
|
||||||
hexColor = "0".repeat(6 - hexColor.length()) + hexColor;
|
hexColor = "0".repeat(6 - hexColor.length()) + hexColor;
|
||||||
|
}
|
||||||
this.coloredName = '#' + hexColor + ' ' + color.getName();
|
this.coloredName = '#' + hexColor + ' ' + color.getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,6 +138,7 @@ public class HopperCounter
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Resets all counters, clearing their items.
|
* Resets all counters, clearing their items.
|
||||||
|
*
|
||||||
* @param fresh Whether or not to start the clocks going immediately or later.
|
* @param fresh Whether or not to start the clocks going immediately or later.
|
||||||
*/
|
*/
|
||||||
public static void resetAll(MinecraftServer server, boolean fresh)
|
public static void resetAll(MinecraftServer server, boolean fresh)
|
||||||
@@ -143,7 +146,10 @@ public class HopperCounter
|
|||||||
for (HopperCounter counter : COUNTERS.values())
|
for (HopperCounter counter : COUNTERS.values())
|
||||||
{
|
{
|
||||||
counter.reset(server);
|
counter.reset(server);
|
||||||
if (fresh) counter.startTick = -1;
|
if (fresh)
|
||||||
|
{
|
||||||
|
counter.startTick = -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,7 +165,10 @@ public class HopperCounter
|
|||||||
List<Component> temp = counter.format(server, realtime, false);
|
List<Component> temp = counter.format(server, realtime, false);
|
||||||
if (temp.size() > 1)
|
if (temp.size() > 1)
|
||||||
{
|
{
|
||||||
if (!text.isEmpty()) text.add(Messenger.s(""));
|
if (!text.isEmpty())
|
||||||
|
{
|
||||||
|
text.add(Messenger.s(""));
|
||||||
|
}
|
||||||
text.addAll(temp);
|
text.addAll(temp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -181,7 +190,7 @@ public class HopperCounter
|
|||||||
{
|
{
|
||||||
if (brief)
|
if (brief)
|
||||||
{
|
{
|
||||||
return Collections.singletonList(Messenger.c("b"+coloredName,"w : ","gi -, -/h, - min "));
|
return Collections.singletonList(Messenger.c("b" + coloredName, "w : ", "gi -, -/h, - min "));
|
||||||
}
|
}
|
||||||
return Collections.singletonList(Messenger.c(coloredName, "w hasn't started counting yet"));
|
return Collections.singletonList(Messenger.c(coloredName, "w hasn't started counting yet"));
|
||||||
}
|
}
|
||||||
@@ -190,36 +199,36 @@ public class HopperCounter
|
|||||||
{
|
{
|
||||||
if (brief)
|
if (brief)
|
||||||
{
|
{
|
||||||
return Collections.singletonList(Messenger.c("b"+coloredName,"w : ","wb 0","w , ","wb 0","w /h, ", String.format("wb %.1f ", ticks / (20.0 * 60.0)), "w min"));
|
return Collections.singletonList(Messenger.c("b" + coloredName, "w : ", "wb 0", "w , ", "wb 0", "w /h, ", String.format("wb %.1f ", ticks / (20.0 * 60.0)), "w min"));
|
||||||
}
|
}
|
||||||
return Collections.singletonList(Messenger.c("w No items for ", coloredName, String.format("w yet (%.2f min.%s)",
|
return Collections.singletonList(Messenger.c("w No items for ", coloredName, String.format("w yet (%.2f min.%s)",
|
||||||
ticks / (20.0 * 60.0), (realTime ? " - real time" : "")),
|
ticks / (20.0 * 60.0), (realTime ? " - real time" : "")),
|
||||||
"nb [X]", "^g reset", "!/counter " + color.getName() +" reset"));
|
"nb [X]", "^g reset", "!/counter " + color.getName() + " reset"));
|
||||||
}
|
}
|
||||||
if (brief)
|
if (brief)
|
||||||
{
|
{
|
||||||
return Collections.singletonList(Messenger.c("b"+coloredName,"w : ",
|
return Collections.singletonList(Messenger.c("b" + coloredName, "w : ",
|
||||||
"wb "+total,"w , ",
|
"wb " + total, "w , ",
|
||||||
"wb "+(total * (20 * 60 * 60) / ticks),"w /h, ",
|
"wb " + (total * (20 * 60 * 60) / ticks), "w /h, ",
|
||||||
String.format("wb %.1f ", ticks / (20.0 * 60.0)), "w min"
|
String.format("wb %.1f ", ticks / (20.0 * 60.0)), "w min"
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
List<Component> items = new ArrayList<>();
|
List<Component> items = new ArrayList<>();
|
||||||
items.add(Messenger.c("w Items for ", coloredName,
|
items.add(Messenger.c("w Items for ", coloredName,
|
||||||
"w (",String.format("wb %.2f", ticks*1.0/(20*60)), "w min"+(realTime?" - real time":"")+"), ",
|
"w (", String.format("wb %.2f", ticks * 1.0 / (20 * 60)), "w min" + (realTime ? " - real time" : "") + "), ",
|
||||||
"w total: ", "wb "+total, "w , (",String.format("wb %.1f",total*1.0*(20*60*60)/ticks),"w /h):",
|
"w total: ", "wb " + total, "w , (", String.format("wb %.1f", total * 1.0 * (20 * 60 * 60) / ticks), "w /h):",
|
||||||
"nb [X]", "^g reset", "!/counter "+color+" reset"
|
"nb [X]", "^g reset", "!/counter " + color + " reset"
|
||||||
));
|
));
|
||||||
items.addAll(counter.object2LongEntrySet().stream().sorted((e, f) -> Long.compare(f.getLongValue(), e.getLongValue())).map(e ->
|
items.addAll(counter.object2LongEntrySet().stream().sorted((e, f) -> Long.compare(f.getLongValue(), e.getLongValue())).map(e ->
|
||||||
{
|
{
|
||||||
Item item = e.getKey();
|
Item item = e.getKey();
|
||||||
MutableComponent itemName = Component.translatable(item.getDescriptionId());
|
MutableComponent itemName = Component.translatable(item.getDescriptionId());
|
||||||
Style itemStyle = itemName.getStyle();
|
Style itemStyle = itemName.getStyle();
|
||||||
TextColor color = guessColor(item, server.registryAccess());
|
TextColor color = guessColor(item, server.overworld());
|
||||||
itemName.setStyle((color != null) ? itemStyle.withColor(color) : itemStyle.withItalic(true));
|
itemName.setStyle((color != null) ? itemStyle.withColor(color) : itemStyle.withItalic(true));
|
||||||
long count = e.getLongValue();
|
long count = e.getLongValue();
|
||||||
return Messenger.c("g - ", itemName,
|
return Messenger.c("g - ", itemName,
|
||||||
"g : ","wb "+count,"g , ",
|
"g : ", "wb " + count, "g , ",
|
||||||
String.format("wb %.1f", count * (20.0 * 60.0 * 60.0) / ticks), "w /h"
|
String.format("wb %.1f", count * (20.0 * 60.0 * 60.0) / ticks), "w /h"
|
||||||
);
|
);
|
||||||
}).collect(Collectors.toList()));
|
}).collect(Collectors.toList()));
|
||||||
@@ -232,13 +241,25 @@ public class HopperCounter
|
|||||||
*/
|
*/
|
||||||
public static int appropriateColor(int color)
|
public static int appropriateColor(int color)
|
||||||
{
|
{
|
||||||
if (color == 0) return MapColor.SNOW.col;
|
if (color == 0)
|
||||||
|
{
|
||||||
|
return MapColor.SNOW.col;
|
||||||
|
}
|
||||||
int r = (color >> 16 & 255);
|
int r = (color >> 16 & 255);
|
||||||
int g = (color >> 8 & 255);
|
int g = (color >> 8 & 255);
|
||||||
int b = (color & 255);
|
int b = (color & 255);
|
||||||
if (r < 70) r = 70;
|
if (r < 70)
|
||||||
if (g < 70) g = 70;
|
{
|
||||||
if (b < 70) b = 70;
|
r = 70;
|
||||||
|
}
|
||||||
|
if (g < 70)
|
||||||
|
{
|
||||||
|
g = 70;
|
||||||
|
}
|
||||||
|
if (b < 70)
|
||||||
|
{
|
||||||
|
b = 70;
|
||||||
|
}
|
||||||
return (r << 16) + (g << 8) + b;
|
return (r << 16) + (g << 8) + b;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -272,65 +293,65 @@ public class HopperCounter
|
|||||||
entry(Items.ROSE_BUSH, Blocks.RED_WOOL),
|
entry(Items.ROSE_BUSH, Blocks.RED_WOOL),
|
||||||
entry(Items.PEONY, Blocks.PINK_WOOL),
|
entry(Items.PEONY, Blocks.PINK_WOOL),
|
||||||
entry(Items.CARROT, Blocks.ORANGE_WOOL),
|
entry(Items.CARROT, Blocks.ORANGE_WOOL),
|
||||||
entry(Items.APPLE,Blocks.RED_WOOL),
|
entry(Items.APPLE, Blocks.RED_WOOL),
|
||||||
entry(Items.WHEAT,Blocks.HAY_BLOCK),
|
entry(Items.WHEAT, Blocks.HAY_BLOCK),
|
||||||
entry(Items.PORKCHOP, Blocks.PINK_WOOL),
|
entry(Items.PORKCHOP, Blocks.PINK_WOOL),
|
||||||
entry(Items.RABBIT,Blocks.PINK_WOOL),
|
entry(Items.RABBIT, Blocks.PINK_WOOL),
|
||||||
entry(Items.CHICKEN,Blocks.WHITE_TERRACOTTA),
|
entry(Items.CHICKEN, Blocks.WHITE_TERRACOTTA),
|
||||||
entry(Items.BEEF,Blocks.NETHERRACK),
|
entry(Items.BEEF, Blocks.NETHERRACK),
|
||||||
entry(Items.ENCHANTED_GOLDEN_APPLE,Blocks.GOLD_BLOCK),
|
entry(Items.ENCHANTED_GOLDEN_APPLE, Blocks.GOLD_BLOCK),
|
||||||
entry(Items.COD,Blocks.WHITE_TERRACOTTA),
|
entry(Items.COD, Blocks.WHITE_TERRACOTTA),
|
||||||
entry(Items.SALMON,Blocks.ACACIA_PLANKS),
|
entry(Items.SALMON, Blocks.ACACIA_PLANKS),
|
||||||
entry(Items.ROTTEN_FLESH,Blocks.BROWN_WOOL),
|
entry(Items.ROTTEN_FLESH, Blocks.BROWN_WOOL),
|
||||||
entry(Items.PUFFERFISH,Blocks.YELLOW_TERRACOTTA),
|
entry(Items.PUFFERFISH, Blocks.YELLOW_TERRACOTTA),
|
||||||
entry(Items.TROPICAL_FISH,Blocks.ORANGE_WOOL),
|
entry(Items.TROPICAL_FISH, Blocks.ORANGE_WOOL),
|
||||||
entry(Items.POTATO,Blocks.WHITE_TERRACOTTA),
|
entry(Items.POTATO, Blocks.WHITE_TERRACOTTA),
|
||||||
entry(Items.MUTTON, Blocks.RED_WOOL),
|
entry(Items.MUTTON, Blocks.RED_WOOL),
|
||||||
entry(Items.BEETROOT,Blocks.NETHERRACK),
|
entry(Items.BEETROOT, Blocks.NETHERRACK),
|
||||||
entry(Items.MELON_SLICE,Blocks.MELON),
|
entry(Items.MELON_SLICE, Blocks.MELON),
|
||||||
entry(Items.POISONOUS_POTATO,Blocks.SLIME_BLOCK),
|
entry(Items.POISONOUS_POTATO, Blocks.SLIME_BLOCK),
|
||||||
entry(Items.SPIDER_EYE,Blocks.NETHERRACK),
|
entry(Items.SPIDER_EYE, Blocks.NETHERRACK),
|
||||||
entry(Items.GUNPOWDER,Blocks.GRAY_WOOL),
|
entry(Items.GUNPOWDER, Blocks.GRAY_WOOL),
|
||||||
entry(Items.TURTLE_SCUTE,Blocks.LIME_WOOL),
|
entry(Items.TURTLE_SCUTE, Blocks.LIME_WOOL),
|
||||||
entry(Items.ARMADILLO_SCUTE,Blocks.ANCIENT_DEBRIS),
|
entry(Items.ARMADILLO_SCUTE, Blocks.ANCIENT_DEBRIS),
|
||||||
entry(Items.FEATHER,Blocks.WHITE_WOOL),
|
entry(Items.FEATHER, Blocks.WHITE_WOOL),
|
||||||
entry(Items.FLINT,Blocks.BLACK_WOOL),
|
entry(Items.FLINT, Blocks.BLACK_WOOL),
|
||||||
entry(Items.LEATHER,Blocks.SPRUCE_PLANKS),
|
entry(Items.LEATHER, Blocks.SPRUCE_PLANKS),
|
||||||
entry(Items.GLOWSTONE_DUST,Blocks.GLOWSTONE),
|
entry(Items.GLOWSTONE_DUST, Blocks.GLOWSTONE),
|
||||||
entry(Items.PAPER,Blocks.WHITE_WOOL),
|
entry(Items.PAPER, Blocks.WHITE_WOOL),
|
||||||
entry(Items.BRICK,Blocks.BRICKS),
|
entry(Items.BRICK, Blocks.BRICKS),
|
||||||
entry(Items.INK_SAC,Blocks.BLACK_WOOL),
|
entry(Items.INK_SAC, Blocks.BLACK_WOOL),
|
||||||
entry(Items.SNOWBALL,Blocks.SNOW_BLOCK),
|
entry(Items.SNOWBALL, Blocks.SNOW_BLOCK),
|
||||||
entry(Items.WATER_BUCKET,Blocks.WATER),
|
entry(Items.WATER_BUCKET, Blocks.WATER),
|
||||||
entry(Items.LAVA_BUCKET,Blocks.LAVA),
|
entry(Items.LAVA_BUCKET, Blocks.LAVA),
|
||||||
entry(Items.MILK_BUCKET,Blocks.WHITE_WOOL),
|
entry(Items.MILK_BUCKET, Blocks.WHITE_WOOL),
|
||||||
entry(Items.CLAY_BALL, Blocks.CLAY),
|
entry(Items.CLAY_BALL, Blocks.CLAY),
|
||||||
entry(Items.COCOA_BEANS,Blocks.COCOA),
|
entry(Items.COCOA_BEANS, Blocks.COCOA),
|
||||||
entry(Items.BONE,Blocks.BONE_BLOCK),
|
entry(Items.BONE, Blocks.BONE_BLOCK),
|
||||||
entry(Items.COD_BUCKET,Blocks.BROWN_TERRACOTTA),
|
entry(Items.COD_BUCKET, Blocks.BROWN_TERRACOTTA),
|
||||||
entry(Items.PUFFERFISH_BUCKET,Blocks.YELLOW_TERRACOTTA),
|
entry(Items.PUFFERFISH_BUCKET, Blocks.YELLOW_TERRACOTTA),
|
||||||
entry(Items.SALMON_BUCKET,Blocks.PINK_TERRACOTTA),
|
entry(Items.SALMON_BUCKET, Blocks.PINK_TERRACOTTA),
|
||||||
entry(Items.TROPICAL_FISH_BUCKET,Blocks.ORANGE_TERRACOTTA),
|
entry(Items.TROPICAL_FISH_BUCKET, Blocks.ORANGE_TERRACOTTA),
|
||||||
entry(Items.SUGAR,Blocks.WHITE_WOOL),
|
entry(Items.SUGAR, Blocks.WHITE_WOOL),
|
||||||
entry(Items.BLAZE_POWDER,Blocks.GOLD_BLOCK),
|
entry(Items.BLAZE_POWDER, Blocks.GOLD_BLOCK),
|
||||||
entry(Items.ENDER_PEARL,Blocks.WARPED_PLANKS),
|
entry(Items.ENDER_PEARL, Blocks.WARPED_PLANKS),
|
||||||
entry(Items.NETHER_STAR,Blocks.DIAMOND_BLOCK),
|
entry(Items.NETHER_STAR, Blocks.DIAMOND_BLOCK),
|
||||||
entry(Items.PRISMARINE_CRYSTALS,Blocks.SEA_LANTERN),
|
entry(Items.PRISMARINE_CRYSTALS, Blocks.SEA_LANTERN),
|
||||||
entry(Items.PRISMARINE_SHARD,Blocks.PRISMARINE),
|
entry(Items.PRISMARINE_SHARD, Blocks.PRISMARINE),
|
||||||
entry(Items.RABBIT_HIDE,Blocks.OAK_PLANKS),
|
entry(Items.RABBIT_HIDE, Blocks.OAK_PLANKS),
|
||||||
entry(Items.CHORUS_FRUIT,Blocks.PURPUR_BLOCK),
|
entry(Items.CHORUS_FRUIT, Blocks.PURPUR_BLOCK),
|
||||||
entry(Items.SHULKER_SHELL,Blocks.SHULKER_BOX),
|
entry(Items.SHULKER_SHELL, Blocks.SHULKER_BOX),
|
||||||
entry(Items.NAUTILUS_SHELL,Blocks.BONE_BLOCK),
|
entry(Items.NAUTILUS_SHELL, Blocks.BONE_BLOCK),
|
||||||
entry(Items.HEART_OF_THE_SEA,Blocks.CONDUIT),
|
entry(Items.HEART_OF_THE_SEA, Blocks.CONDUIT),
|
||||||
entry(Items.HONEYCOMB,Blocks.HONEYCOMB_BLOCK),
|
entry(Items.HONEYCOMB, Blocks.HONEYCOMB_BLOCK),
|
||||||
entry(Items.NAME_TAG,Blocks.BONE_BLOCK),
|
entry(Items.NAME_TAG, Blocks.BONE_BLOCK),
|
||||||
entry(Items.TOTEM_OF_UNDYING,Blocks.YELLOW_TERRACOTTA),
|
entry(Items.TOTEM_OF_UNDYING, Blocks.YELLOW_TERRACOTTA),
|
||||||
entry(Items.TRIDENT,Blocks.PRISMARINE),
|
entry(Items.TRIDENT, Blocks.PRISMARINE),
|
||||||
entry(Items.GHAST_TEAR,Blocks.WHITE_WOOL),
|
entry(Items.GHAST_TEAR, Blocks.WHITE_WOOL),
|
||||||
entry(Items.PHANTOM_MEMBRANE,Blocks.BONE_BLOCK),
|
entry(Items.PHANTOM_MEMBRANE, Blocks.BONE_BLOCK),
|
||||||
entry(Items.EGG,Blocks.BONE_BLOCK),
|
entry(Items.EGG, Blocks.BONE_BLOCK),
|
||||||
//entry(Items.,Blocks.),
|
//entry(Items.,Blocks.),
|
||||||
entry(Items.COPPER_INGOT,Blocks.COPPER_BLOCK),
|
entry(Items.COPPER_INGOT, Blocks.COPPER_BLOCK),
|
||||||
entry(Items.AMETHYST_SHARD, Blocks.AMETHYST_BLOCK));
|
entry(Items.AMETHYST_SHARD, Blocks.AMETHYST_BLOCK));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -338,11 +359,17 @@ public class HopperCounter
|
|||||||
*/
|
*/
|
||||||
public static TextColor fromItem(Item item, RegistryAccess registryAccess)
|
public static TextColor fromItem(Item item, RegistryAccess registryAccess)
|
||||||
{
|
{
|
||||||
if (DEFAULTS.containsKey(item)) return TextColor.fromRgb(appropriateColor(DEFAULTS.get(item).defaultMapColor().col));
|
if (DEFAULTS.containsKey(item))
|
||||||
if (item instanceof DyeItem dye) return TextColor.fromRgb(appropriateColor(dye.getDyeColor().getMapColor().col));
|
{
|
||||||
|
return TextColor.fromRgb(appropriateColor(DEFAULTS.get(item).defaultMapColor().col));
|
||||||
|
}
|
||||||
|
if (item instanceof DyeItem dye)
|
||||||
|
{
|
||||||
|
return TextColor.fromRgb(appropriateColor(dye.getDyeColor().getMapColor().col));
|
||||||
|
}
|
||||||
Block block = null;
|
Block block = null;
|
||||||
final Registry<Item> itemRegistry = registryAccess.registryOrThrow(Registries.ITEM);
|
final Registry<Item> itemRegistry = registryAccess.lookupOrThrow(Registries.ITEM);
|
||||||
final Registry<Block> blockRegistry = registryAccess.registryOrThrow(Registries.BLOCK);
|
final Registry<Block> blockRegistry = registryAccess.lookupOrThrow(Registries.BLOCK);
|
||||||
ResourceLocation id = itemRegistry.getKey(item);
|
ResourceLocation id = itemRegistry.getKey(item);
|
||||||
if (item instanceof BlockItem blockItem)
|
if (item instanceof BlockItem blockItem)
|
||||||
{
|
{
|
||||||
@@ -350,13 +377,19 @@ public class HopperCounter
|
|||||||
}
|
}
|
||||||
else if (blockRegistry.getOptional(id).isPresent())
|
else if (blockRegistry.getOptional(id).isPresent())
|
||||||
{
|
{
|
||||||
block = blockRegistry.get(id);
|
block = blockRegistry.getValue(id);
|
||||||
}
|
}
|
||||||
if (block != null)
|
if (block != null)
|
||||||
{
|
{
|
||||||
if (block instanceof AbstractBannerBlock) return TextColor.fromRgb(appropriateColor(((AbstractBannerBlock) block).getColor().getMapColor().col));
|
if (block instanceof AbstractBannerBlock)
|
||||||
if (block instanceof BeaconBeamBlock) return TextColor.fromRgb(appropriateColor( ((BeaconBeamBlock) block).getColor().getMapColor().col));
|
{
|
||||||
return TextColor.fromRgb(appropriateColor( block.defaultMapColor().col));
|
return TextColor.fromRgb(appropriateColor(((AbstractBannerBlock) block).getColor().getMapColor().col));
|
||||||
|
}
|
||||||
|
if (block instanceof BeaconBeamBlock)
|
||||||
|
{
|
||||||
|
return TextColor.fromRgb(appropriateColor(((BeaconBeamBlock) block).getColor().getMapColor().col));
|
||||||
|
}
|
||||||
|
return TextColor.fromRgb(appropriateColor(block.defaultMapColor().col));
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -365,38 +398,45 @@ public class HopperCounter
|
|||||||
* Guesses the item's colour from the item itself. It first calls {@link HopperCounter#fromItem} to see if it has a
|
* Guesses the item's colour from the item itself. It first calls {@link HopperCounter#fromItem} to see if it has a
|
||||||
* valid colour there, if not just makes a guess, and if that fails just returns null
|
* valid colour there, if not just makes a guess, and if that fails just returns null
|
||||||
*/
|
*/
|
||||||
public static TextColor guessColor(Item item, RegistryAccess registryAccess)
|
public static TextColor guessColor(Item item, Level level)
|
||||||
{
|
{
|
||||||
|
RegistryAccess registryAccess = level.registryAccess();
|
||||||
TextColor direct = fromItem(item, registryAccess);
|
TextColor direct = fromItem(item, registryAccess);
|
||||||
if (direct != null) return direct;
|
if (direct != null)
|
||||||
if (CarpetServer.minecraft_server == null) return WHITE;
|
|
||||||
|
|
||||||
ResourceLocation id = registryAccess.registryOrThrow(Registries.ITEM).getKey(item);
|
|
||||||
for (RecipeType<?> type: registryAccess.registryOrThrow(Registries.RECIPE_TYPE))
|
|
||||||
{
|
{
|
||||||
for (Recipe<?> r: ((RecipeManagerInterface) CarpetServer.minecraft_server.getRecipeManager()).getAllMatching(type, id, registryAccess))
|
return direct;
|
||||||
|
}
|
||||||
|
if (CarpetServer.minecraft_server == null)
|
||||||
|
{
|
||||||
|
return WHITE;
|
||||||
|
}
|
||||||
|
|
||||||
|
ResourceLocation id = registryAccess.lookupOrThrow(Registries.ITEM).getKey(item);
|
||||||
|
if (id == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Recipe<?> r : RecipeHelper.getRecipesForOutput(CarpetServer.minecraft_server.getRecipeManager(), id, level))
|
||||||
|
{
|
||||||
|
for (Ingredient ingredient : r.placementInfo().ingredients())
|
||||||
{
|
{
|
||||||
for (Ingredient ingredient: r.getIngredients())
|
Optional<Holder<Item>> match = ingredient.items().filter(stack -> fromItem(stack.value(), registryAccess) != null).findFirst();
|
||||||
|
if (match.isPresent())
|
||||||
{
|
{
|
||||||
for (Collection<ItemStack> stacks : ((IngredientInterface) (Object) ingredient).getRecipeStacks())
|
return fromItem(match.get().value(), registryAccess);
|
||||||
{
|
|
||||||
for (ItemStack iStak : stacks)
|
|
||||||
{
|
|
||||||
TextColor cand = fromItem(iStak.getItem(), registryAccess);
|
|
||||||
if (cand != null)
|
|
||||||
return cand;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the hopper counter for the given color
|
* Returns the hopper counter for the given color
|
||||||
*/
|
*/
|
||||||
public static HopperCounter getCounter(DyeColor color) {
|
public static HopperCounter getCounter(DyeColor color)
|
||||||
|
{
|
||||||
return COUNTERS.get(color);
|
return COUNTERS.get(color);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -421,6 +461,6 @@ public class HopperCounter
|
|||||||
*/
|
*/
|
||||||
public long getTotalItems()
|
public long getTotalItems()
|
||||||
{
|
{
|
||||||
return counter.isEmpty()?0:counter.values().longStream().sum();
|
return counter.isEmpty() ? 0 : counter.values().longStream().sum();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,80 +1,39 @@
|
|||||||
package carpet.helpers;
|
package carpet.helpers;
|
||||||
//Author: masa
|
//Author: masa
|
||||||
|
|
||||||
import java.math.RoundingMode;
|
|
||||||
import java.text.NumberFormat;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import net.minecraft.Util;
|
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.core.particles.ParticleTypes;
|
|
||||||
import net.minecraft.server.level.ServerLevel;
|
|
||||||
import net.minecraft.sounds.SoundEvents;
|
|
||||||
import net.minecraft.sounds.SoundSource;
|
|
||||||
import net.minecraft.util.Mth;
|
|
||||||
import net.minecraft.world.entity.Entity;
|
|
||||||
import net.minecraft.world.entity.LivingEntity;
|
|
||||||
import net.minecraft.world.entity.ai.attributes.Attributes;
|
|
||||||
import net.minecraft.world.entity.item.ItemEntity;
|
|
||||||
import net.minecraft.world.entity.item.PrimedTnt;
|
|
||||||
import net.minecraft.world.entity.player.Player;
|
|
||||||
import net.minecraft.world.item.ItemStack;
|
|
||||||
import net.minecraft.world.level.Explosion;
|
import net.minecraft.world.level.Explosion;
|
||||||
import net.minecraft.world.level.Level;
|
|
||||||
import net.minecraft.world.level.block.Block;
|
|
||||||
import net.minecraft.world.level.block.Blocks;
|
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.level.chunk.ChunkAccess;
|
|
||||||
import net.minecraft.world.level.material.FluidState;
|
import net.minecraft.world.level.material.FluidState;
|
||||||
import net.minecraft.world.level.storage.loot.LootParams;
|
|
||||||
import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
|
|
||||||
import net.minecraft.world.phys.AABB;
|
import net.minecraft.world.phys.AABB;
|
||||||
import net.minecraft.world.phys.Vec3;
|
import net.minecraft.world.phys.Vec3;
|
||||||
import carpet.logging.logHelpers.ExplosionLogHelper;
|
import carpet.logging.logHelpers.ExplosionLogHelper;
|
||||||
import carpet.mixins.ExplosionAccessor;
|
import carpet.mixins.ExplosionAccessor;
|
||||||
import carpet.CarpetSettings;
|
import carpet.CarpetSettings;
|
||||||
import carpet.utils.Messenger;
|
|
||||||
import it.unimi.dsi.fastutil.objects.Object2DoubleOpenHashMap;
|
import it.unimi.dsi.fastutil.objects.Object2DoubleOpenHashMap;
|
||||||
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
||||||
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
|
|
||||||
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
|
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
|
||||||
import org.apache.commons.lang3.tuple.MutablePair;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
|
|
||||||
import static carpet.script.CarpetEventServer.Event.EXPLOSION_OUTCOME;
|
|
||||||
|
|
||||||
public class OptimizedExplosion
|
public class OptimizedExplosion
|
||||||
{
|
{
|
||||||
private static List<Entity> entitylist;
|
|
||||||
private static Vec3 vec3dmem;
|
|
||||||
private static long tickmem;
|
|
||||||
// For disabling the explosion particles and sound
|
|
||||||
public static int explosionSound = 0;
|
|
||||||
|
|
||||||
// masa's optimizations
|
// masa's optimizations
|
||||||
private static Object2DoubleOpenHashMap<Pair<Vec3, AABB>> densityCache = new Object2DoubleOpenHashMap<>();
|
private static Object2DoubleOpenHashMap<Pair<Vec3, AABB>> densityCache = new Object2DoubleOpenHashMap<>();
|
||||||
private static MutablePair<Vec3, AABB> pairMutable = new MutablePair<>();
|
|
||||||
private static Object2ObjectOpenHashMap<BlockPos, BlockState> stateCache = new Object2ObjectOpenHashMap<>();
|
private static Object2ObjectOpenHashMap<BlockPos, BlockState> stateCache = new Object2ObjectOpenHashMap<>();
|
||||||
private static Object2ObjectOpenHashMap<BlockPos, FluidState> fluidCache = new Object2ObjectOpenHashMap<>();
|
private static Object2ObjectOpenHashMap<BlockPos, FluidState> fluidCache = new Object2ObjectOpenHashMap<>();
|
||||||
private static BlockPos.MutableBlockPos posMutable = new BlockPos.MutableBlockPos(0, 0, 0);
|
private static BlockPos.MutableBlockPos posMutable = new BlockPos.MutableBlockPos(0, 0, 0);
|
||||||
private static ObjectOpenHashSet<BlockPos> affectedBlockPositionsSet = new ObjectOpenHashSet<>();
|
private static ObjectOpenHashSet<BlockPos> affectedBlockPositionsSet = new ObjectOpenHashSet<>();
|
||||||
private static boolean firstRay;
|
private static boolean firstRay;
|
||||||
private static boolean rayCalcDone;
|
private static boolean rayCalcDone;
|
||||||
private static ArrayList<Float> chances = new ArrayList<>();
|
|
||||||
private static BlockPos blastChanceLocation;
|
|
||||||
|
|
||||||
// Creating entity list for scarpet event
|
public static List<BlockPos> doExplosionA(Explosion e, ExplosionLogHelper eLogger) {
|
||||||
private static List<Entity> entityList = new ArrayList<>();
|
|
||||||
|
|
||||||
public static void doExplosionA(Explosion e, ExplosionLogHelper eLogger) {
|
|
||||||
ExplosionAccessor eAccess = (ExplosionAccessor) e;
|
ExplosionAccessor eAccess = (ExplosionAccessor) e;
|
||||||
|
|
||||||
entityList.clear();
|
List<BlockPos> toBlow;
|
||||||
boolean eventNeeded = EXPLOSION_OUTCOME.isNeeded() && !eAccess.getLevel().isClientSide();
|
|
||||||
blastCalc(e);
|
|
||||||
|
|
||||||
if (!CarpetSettings.explosionNoBlockDamage && eAccess.getDamageSource() != null) {
|
if (!CarpetSettings.explosionNoBlockDamage && eAccess.getDamageSource() != null) {
|
||||||
rayCalcDone = false;
|
rayCalcDone = false;
|
||||||
@@ -88,291 +47,14 @@ public class OptimizedExplosion
|
|||||||
stateCache.clear();
|
stateCache.clear();
|
||||||
fluidCache.clear();
|
fluidCache.clear();
|
||||||
|
|
||||||
e.getToBlow().addAll(affectedBlockPositionsSet);
|
toBlow = new ArrayList<>(affectedBlockPositionsSet);
|
||||||
affectedBlockPositionsSet.clear();
|
affectedBlockPositionsSet.clear();
|
||||||
|
} else {
|
||||||
|
toBlow = Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
float f3 = eAccess.getRadius() * 2.0F;
|
|
||||||
int k1 = Mth.floor(eAccess.getX() - (double) f3 - 1.0D);
|
|
||||||
int l1 = Mth.floor(eAccess.getX() + (double) f3 + 1.0D);
|
|
||||||
int i2 = Mth.floor(eAccess.getY() - (double) f3 - 1.0D);
|
|
||||||
int i1 = Mth.floor(eAccess.getY() + (double) f3 + 1.0D);
|
|
||||||
int j2 = Mth.floor(eAccess.getZ() - (double) f3 - 1.0D);
|
|
||||||
int j1 = Mth.floor(eAccess.getZ() + (double) f3 + 1.0D);
|
|
||||||
Vec3 vec3d = new Vec3(eAccess.getX(), eAccess.getY(), eAccess.getZ());
|
|
||||||
|
|
||||||
if (vec3dmem == null || !vec3dmem.equals(vec3d) || tickmem != eAccess.getLevel().getGameTime()) {
|
|
||||||
vec3dmem = vec3d;
|
|
||||||
tickmem = eAccess.getLevel().getGameTime();
|
|
||||||
entitylist = eAccess.getLevel().getEntities(null, new AABB(k1, i2, j2, l1, i1, j1));
|
|
||||||
explosionSound = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
explosionSound++;
|
|
||||||
|
|
||||||
Entity explodingEntity = eAccess.getSource();
|
|
||||||
for (int k2 = 0; k2 < entitylist.size(); ++k2) {
|
|
||||||
Entity entity = entitylist.get(k2);
|
|
||||||
|
|
||||||
|
|
||||||
if (entity == explodingEntity) {
|
|
||||||
// entitylist.remove(k2);
|
|
||||||
removeFast(entitylist, k2);
|
|
||||||
k2--;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (entity instanceof PrimedTnt && explodingEntity != null &&
|
|
||||||
entity.getX() == explodingEntity.getX() &&
|
|
||||||
entity.getY() == explodingEntity.getY() &&
|
|
||||||
entity.getZ() == explodingEntity.getZ()) {
|
|
||||||
if (eLogger != null) {
|
|
||||||
eLogger.onEntityImpacted(entity, new Vec3(0,-0.9923437498509884d, 0));
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!entity.ignoreExplosion(e)) {
|
|
||||||
double d12 = Math.sqrt(entity.distanceToSqr(eAccess.getX(), eAccess.getY(), eAccess.getZ())) / (double) f3;
|
|
||||||
|
|
||||||
if (d12 <= 1.0D) {
|
|
||||||
double d5 = entity.getX() - eAccess.getX();
|
|
||||||
// Change in 1.16 snapshots to fix a bug with TNT jumping
|
|
||||||
double d7 = (entity instanceof PrimedTnt ? entity.getY() : entity.getEyeY()) - eAccess.getY();
|
|
||||||
double d9 = entity.getZ() - eAccess.getZ();
|
|
||||||
double d13 = (double) Math.sqrt(d5 * d5 + d7 * d7 + d9 * d9);
|
|
||||||
|
|
||||||
if (d13 != 0.0D) {
|
|
||||||
d5 = d5 / d13;
|
|
||||||
d7 = d7 / d13;
|
|
||||||
d9 = d9 / d13;
|
|
||||||
double density;
|
|
||||||
|
|
||||||
pairMutable.setLeft(vec3d);
|
|
||||||
pairMutable.setRight(entity.getBoundingBox());
|
|
||||||
density = densityCache.getOrDefault(pairMutable, Double.MAX_VALUE);
|
|
||||||
|
|
||||||
if (density == Double.MAX_VALUE)
|
|
||||||
{
|
|
||||||
Pair<Vec3, AABB> pair = Pair.of(vec3d, entity.getBoundingBox());
|
|
||||||
density = Explosion.getSeenPercent(vec3d, entity);
|
|
||||||
densityCache.put(pair, density);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If it is needed, it saves the entity
|
|
||||||
if (eventNeeded) {
|
|
||||||
entityList.add(entity);
|
|
||||||
}
|
|
||||||
|
|
||||||
double d10 = (1.0D - d12) * density;
|
|
||||||
if (eAccess.getDamageSource() != null)
|
|
||||||
{
|
|
||||||
entity.hurt(eAccess.getDamageSource(),
|
|
||||||
(float) ((int) ((d10 * d10 + d10) / 2.0D * 7.0D * (double) f3 + 1.0D)));
|
|
||||||
}
|
|
||||||
double d11 = d10;
|
|
||||||
|
|
||||||
if (entity instanceof LivingEntity lev) {
|
|
||||||
d11 = d10 * Mth.clamp(1.0 - lev.getAttributeValue(Attributes.EXPLOSION_KNOCKBACK_RESISTANCE), 0.0, 1.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (eLogger != null) {
|
|
||||||
eLogger.onEntityImpacted(entity, new Vec3(d5 * d11, d7 * d11, d9 * d11));
|
|
||||||
}
|
|
||||||
|
|
||||||
entity.setDeltaMovement(entity.getDeltaMovement().add(d5 * d11, d7 * d11, d9 * d11));
|
|
||||||
|
|
||||||
if (entity instanceof Player player) {
|
|
||||||
|
|
||||||
if (!player.isSpectator()
|
|
||||||
&& (!player.isCreative() || !player.getAbilities().flying)) { //getAbilities
|
|
||||||
e.getHitPlayers().put(player, new Vec3(d5 * d10, d7 * d10, d9 * d10));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
densityCache.clear();
|
densityCache.clear();
|
||||||
}
|
|
||||||
|
|
||||||
public static void doExplosionB(Explosion e, boolean spawnParticles)
|
return toBlow;
|
||||||
{
|
|
||||||
ExplosionAccessor eAccess = (ExplosionAccessor) e;
|
|
||||||
Level world = eAccess.getLevel();
|
|
||||||
double posX = eAccess.getX();
|
|
||||||
double posY = eAccess.getY();
|
|
||||||
double posZ = eAccess.getZ();
|
|
||||||
|
|
||||||
// If it is needed, calls scarpet event
|
|
||||||
if (EXPLOSION_OUTCOME.isNeeded() && !world.isClientSide()) {
|
|
||||||
EXPLOSION_OUTCOME.onExplosion((ServerLevel) world, eAccess.getSource(), e::getIndirectSourceEntity, eAccess.getX(), eAccess.getY(), eAccess.getZ(), eAccess.getRadius(), eAccess.isFire(), e.getToBlow(), entityList, eAccess.getBlockInteraction());
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean damagesTerrain = eAccess.getBlockInteraction() != Explosion.BlockInteraction.KEEP;
|
|
||||||
|
|
||||||
// explosionSound incremented till disabling the explosion particles and sound
|
|
||||||
if (explosionSound < 100 || explosionSound % 100 == 0)
|
|
||||||
{
|
|
||||||
world.playSound(null, posX, posY, posZ, SoundEvents.GENERIC_EXPLODE.value(), SoundSource.BLOCKS, 4.0F,
|
|
||||||
(1.0F + (world.random.nextFloat() - world.random.nextFloat()) * 0.2F) * 0.7F);
|
|
||||||
|
|
||||||
if (spawnParticles)
|
|
||||||
{
|
|
||||||
if (eAccess.getRadius() >= 2.0F && damagesTerrain)
|
|
||||||
{
|
|
||||||
world.addParticle(ParticleTypes.EXPLOSION_EMITTER, posX, posY, posZ, 1.0D, 0.0D, 0.0D);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
world.addParticle(ParticleTypes.EXPLOSION, posX, posY, posZ, 1.0D, 0.0D, 0.0D);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (damagesTerrain)
|
|
||||||
{
|
|
||||||
ObjectArrayList<Pair<ItemStack, BlockPos>> objectArrayList = new ObjectArrayList<>();
|
|
||||||
Util.shuffle((ObjectArrayList<BlockPos>) e.getToBlow(), world.random);
|
|
||||||
|
|
||||||
boolean dropFromExplosions = CarpetSettings.xpFromExplosions || e.getIndirectSourceEntity() instanceof Player;
|
|
||||||
|
|
||||||
for (BlockPos blockpos : e.getToBlow())
|
|
||||||
{
|
|
||||||
BlockState state = world.getBlockState(blockpos);
|
|
||||||
Block block = state.getBlock();
|
|
||||||
|
|
||||||
if (!state.isAir())
|
|
||||||
{
|
|
||||||
if (block.dropFromExplosion(e) && world instanceof ServerLevel serverLevel)
|
|
||||||
{
|
|
||||||
BlockEntity blockEntity = state.hasBlockEntity() ? world.getBlockEntity(blockpos) : null; //hasBlockEntity()
|
|
||||||
|
|
||||||
LootParams.Builder lootBuilder = (new LootParams.Builder((ServerLevel)eAccess.getLevel()))
|
|
||||||
.withParameter(LootContextParams.ORIGIN, Vec3.atCenterOf(blockpos))
|
|
||||||
.withParameter(LootContextParams.TOOL, ItemStack.EMPTY)
|
|
||||||
.withOptionalParameter(LootContextParams.BLOCK_ENTITY, blockEntity)
|
|
||||||
.withOptionalParameter(LootContextParams.THIS_ENTITY, eAccess.getSource());
|
|
||||||
|
|
||||||
if (eAccess.getBlockInteraction() == Explosion.BlockInteraction.DESTROY_WITH_DECAY)
|
|
||||||
lootBuilder.withParameter(LootContextParams.EXPLOSION_RADIUS, eAccess.getRadius());
|
|
||||||
|
|
||||||
state.spawnAfterBreak(serverLevel, blockpos, ItemStack.EMPTY, dropFromExplosions);
|
|
||||||
|
|
||||||
state.getDrops(lootBuilder).forEach((itemStackx) -> {
|
|
||||||
method_24023(objectArrayList, itemStackx, blockpos.immutable());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
world.setBlock(blockpos, Blocks.AIR.defaultBlockState(), 3);
|
|
||||||
block.wasExploded(world, blockpos, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
objectArrayList.forEach(p -> Block.popResource(world, p.getRight(), p.getLeft()));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (eAccess.isFire())
|
|
||||||
{
|
|
||||||
for (BlockPos blockpos1 : e.getToBlow())
|
|
||||||
{
|
|
||||||
// Use the same Chunk reference because the positions are in the same xz-column
|
|
||||||
ChunkAccess chunk = world.getChunk(blockpos1.getX() >> 4, blockpos1.getZ() >> 4);
|
|
||||||
|
|
||||||
BlockPos down = blockpos1.below(1);
|
|
||||||
if (eAccess.getRandom().nextInt(3) == 0 &&
|
|
||||||
chunk.getBlockState(blockpos1).isAir() &&
|
|
||||||
chunk.getBlockState(down).isSolidRender(world, down)
|
|
||||||
)
|
|
||||||
{
|
|
||||||
world.setBlockAndUpdate(blockpos1, Blocks.FIRE.defaultBlockState());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// copied from Explosion, need to move the code to the explosion code anyways and use shadows for
|
|
||||||
// simplicity, its not jarmodding anyways
|
|
||||||
private static void method_24023(ObjectArrayList<Pair<ItemStack, BlockPos>> objectArrayList, ItemStack itemStack, BlockPos blockPos) {
|
|
||||||
int i = objectArrayList.size();
|
|
||||||
|
|
||||||
for(int j = 0; j < i; ++j) {
|
|
||||||
Pair<ItemStack, BlockPos> pair = objectArrayList.get(j);
|
|
||||||
ItemStack itemStack2 = pair.getLeft();
|
|
||||||
if (ItemEntity.areMergable(itemStack2, itemStack)) {
|
|
||||||
ItemStack itemStack3 = ItemEntity.merge(itemStack2, itemStack, 16);
|
|
||||||
objectArrayList.set(j, Pair.of(itemStack3, pair.getRight()));
|
|
||||||
if (itemStack.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
objectArrayList.add(Pair.of(itemStack, blockPos));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void removeFast(List<Entity> lst, int index) {
|
|
||||||
if (index < lst.size() - 1)
|
|
||||||
lst.set(index, lst.get(lst.size() - 1));
|
|
||||||
lst.remove(lst.size() - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void rayCalcs(Explosion e) {
|
|
||||||
ExplosionAccessor eAccess = (ExplosionAccessor) e;
|
|
||||||
boolean first = true;
|
|
||||||
|
|
||||||
for (int j = 0; j < 16; ++j) {
|
|
||||||
for (int k = 0; k < 16; ++k) {
|
|
||||||
for (int l = 0; l < 16; ++l) {
|
|
||||||
if (j == 0 || j == 15 || k == 0 || k == 15 || l == 0 || l == 15) {
|
|
||||||
double d0 = (double) ((float) j / 15.0F * 2.0F - 1.0F);
|
|
||||||
double d1 = (double) ((float) k / 15.0F * 2.0F - 1.0F);
|
|
||||||
double d2 = (double) ((float) l / 15.0F * 2.0F - 1.0F);
|
|
||||||
double d3 = Math.sqrt(d0 * d0 + d1 * d1 + d2 * d2);
|
|
||||||
d0 = d0 / d3;
|
|
||||||
d1 = d1 / d3;
|
|
||||||
d2 = d2 / d3;
|
|
||||||
float rand = eAccess.getLevel().random.nextFloat();
|
|
||||||
if (CarpetSettings.tntRandomRange >= 0) {
|
|
||||||
rand = (float) CarpetSettings.tntRandomRange;
|
|
||||||
}
|
|
||||||
float f = eAccess.getRadius() * (0.7F + rand * 0.6F);
|
|
||||||
double d4 = eAccess.getX();
|
|
||||||
double d6 = eAccess.getY();
|
|
||||||
double d8 = eAccess.getZ();
|
|
||||||
|
|
||||||
for (float f1 = 0.3F; f > 0.0F; f -= 0.22500001F) {
|
|
||||||
BlockPos blockpos = BlockPos.containing(d4, d6, d8);
|
|
||||||
BlockState state = eAccess.getLevel().getBlockState(blockpos);
|
|
||||||
FluidState fluidState = eAccess.getLevel().getFluidState(blockpos);
|
|
||||||
|
|
||||||
if (!state.isAir()) {
|
|
||||||
float f2 = Math.max(state.getBlock().getExplosionResistance(), fluidState.getExplosionResistance());
|
|
||||||
if (eAccess.getSource() != null)
|
|
||||||
f2 = eAccess.getSource().getBlockExplosionResistance(e, eAccess.getLevel(), blockpos, state, fluidState, f2);
|
|
||||||
f -= (f2 + 0.3F) * 0.3F;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (f > 0.0F && (eAccess.getSource() == null ||
|
|
||||||
eAccess.getSource().shouldBlockExplode(e, eAccess.getLevel(), blockpos, state, f)))
|
|
||||||
{
|
|
||||||
affectedBlockPositionsSet.add(blockpos);
|
|
||||||
}
|
|
||||||
else if (first) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
first = false;
|
|
||||||
|
|
||||||
d4 += d0 * 0.30000001192092896D;
|
|
||||||
d6 += d1 * 0.30000001192092896D;
|
|
||||||
d8 += d2 * 0.30000001192092896D;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void getAffectedPositionsOnPlaneX(Explosion e, int x, int yStart, int yEnd, int zStart, int zEnd)
|
private static void getAffectedPositionsOnPlaneX(Explosion e, int x, int yStart, int yEnd, int zStart, int zEnd)
|
||||||
@@ -454,9 +136,10 @@ public class OptimizedExplosion
|
|||||||
float rand = eAccess.getLevel().random.nextFloat();
|
float rand = eAccess.getLevel().random.nextFloat();
|
||||||
float sizeRand = (CarpetSettings.tntRandomRange >= 0 ? (float) CarpetSettings.tntRandomRange : rand);
|
float sizeRand = (CarpetSettings.tntRandomRange >= 0 ? (float) CarpetSettings.tntRandomRange : rand);
|
||||||
float size = eAccess.getRadius() * (0.7F + sizeRand * 0.6F);
|
float size = eAccess.getRadius() * (0.7F + sizeRand * 0.6F);
|
||||||
double posX = eAccess.getX();
|
Vec3 vec3 = eAccess.getCenter();
|
||||||
double posY = eAccess.getY();
|
double posX = vec3.x;
|
||||||
double posZ = eAccess.getZ();
|
double posY = vec3.y;
|
||||||
|
double posZ = vec3.z;
|
||||||
|
|
||||||
for (float f1 = 0.3F; size > 0.0F; size -= 0.22500001F)
|
for (float f1 = 0.3F; size > 0.0F; size -= 0.22500001F)
|
||||||
{
|
{
|
||||||
@@ -508,112 +191,4 @@ public class OptimizedExplosion
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setBlastChanceLocation(BlockPos p){
|
|
||||||
blastChanceLocation = p;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void blastCalc(Explosion e){
|
|
||||||
ExplosionAccessor eAccess = (ExplosionAccessor) e;
|
|
||||||
if(blastChanceLocation == null || blastChanceLocation.distToLowCornerSqr(eAccess.getX(), eAccess.getY(), eAccess.getZ()) > 200) return;
|
|
||||||
chances.clear();
|
|
||||||
for (int j = 0; j < 16; ++j) {
|
|
||||||
for (int k = 0; k < 16; ++k) {
|
|
||||||
for (int l = 0; l < 16; ++l) {
|
|
||||||
if (j == 0 || j == 15 || k == 0 || k == 15 || l == 0 || l == 15) {
|
|
||||||
double d0 = (double) ((float) j / 15.0F * 2.0F - 1.0F);
|
|
||||||
double d1 = (double) ((float) k / 15.0F * 2.0F - 1.0F);
|
|
||||||
double d2 = (double) ((float) l / 15.0F * 2.0F - 1.0F);
|
|
||||||
double d3 = Math.sqrt(d0 * d0 + d1 * d1 + d2 * d2);
|
|
||||||
d0 = d0 / d3;
|
|
||||||
d1 = d1 / d3;
|
|
||||||
d2 = d2 / d3;
|
|
||||||
float f = eAccess.getRadius() * (0.7F + 0.6F);
|
|
||||||
double d4 = eAccess.getX();
|
|
||||||
double d6 = eAccess.getY();
|
|
||||||
double d8 = eAccess.getZ();
|
|
||||||
boolean found = false;
|
|
||||||
|
|
||||||
for (float f1 = 0.3F; f > 0.0F; f -= 0.22500001F) {
|
|
||||||
BlockPos blockpos = BlockPos.containing(d4, d6, d8);
|
|
||||||
BlockState state = eAccess.getLevel().getBlockState(blockpos);
|
|
||||||
FluidState fluidState = eAccess.getLevel().getFluidState(blockpos);
|
|
||||||
|
|
||||||
if (!state.isAir()) {
|
|
||||||
float f2 = Math.max(state.getBlock().getExplosionResistance(), fluidState.getExplosionResistance());
|
|
||||||
if (eAccess.getSource() != null)
|
|
||||||
f2 = eAccess.getSource().getBlockExplosionResistance(e, eAccess.getLevel(), blockpos, state, fluidState, f2);
|
|
||||||
f -= (f2 + 0.3F) * 0.3F;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (f > 0.0F && (eAccess.getSource() == null ||
|
|
||||||
eAccess.getSource().shouldBlockExplode(e, eAccess.getLevel(), blockpos, state, f))) {
|
|
||||||
if(!found && blockpos.equals(blastChanceLocation)){
|
|
||||||
chances.add(f);
|
|
||||||
found = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
d4 += d0 * 0.30000001192092896D;
|
|
||||||
d6 += d1 * 0.30000001192092896D;
|
|
||||||
d8 += d2 * 0.30000001192092896D;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//showTNTblastChance(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void showTNTblastChance(Explosion e){
|
|
||||||
ExplosionAccessor eAccess = (ExplosionAccessor) e;
|
|
||||||
double randMax = 0.6F * eAccess.getRadius();
|
|
||||||
double total = 0;
|
|
||||||
boolean fullyBlownUp = false;
|
|
||||||
boolean first = true;
|
|
||||||
int rays = 0;
|
|
||||||
for(float f3 : chances){
|
|
||||||
rays++;
|
|
||||||
double calc = f3 - randMax;
|
|
||||||
if(calc > 0) fullyBlownUp = true;
|
|
||||||
double chancePerRay = (Math.abs(calc) / randMax);
|
|
||||||
if(!fullyBlownUp){
|
|
||||||
if(first){
|
|
||||||
first = false;
|
|
||||||
total = chancePerRay;
|
|
||||||
}else {
|
|
||||||
total = total * chancePerRay;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(fullyBlownUp) total = 0;
|
|
||||||
double chance = 1 - total;
|
|
||||||
NumberFormat nf = NumberFormat.getNumberInstance();
|
|
||||||
nf.setRoundingMode (RoundingMode.DOWN);
|
|
||||||
nf.setMaximumFractionDigits(2);
|
|
||||||
for(Player player : eAccess.getLevel().players()){
|
|
||||||
Messenger.m(player,"w Pop: ",
|
|
||||||
"c " + nf.format(chance) + " ",
|
|
||||||
"^w Chance for the block to be destroyed by the blast: " + chance,
|
|
||||||
"?" + chance,
|
|
||||||
"w Remain: ",
|
|
||||||
String.format("c %.2f ", total),
|
|
||||||
"^w Chance the block survives the blast: " + total,
|
|
||||||
"?" + total,
|
|
||||||
"w Rays: ",
|
|
||||||
String.format("c %d ", rays),
|
|
||||||
"^w TNT blast rays going through the block",
|
|
||||||
"?" + rays,
|
|
||||||
"w Size: ",
|
|
||||||
String.format("c %.1f ", eAccess.getRadius()),
|
|
||||||
"^w TNT blast size",
|
|
||||||
"?" + eAccess.getRadius(),
|
|
||||||
"w @: ",
|
|
||||||
String.format("c [%.1f %.1f %.1f] ", eAccess.getX(), eAccess.getY(), eAccess.getZ()),
|
|
||||||
"^w TNT blast location X:" + eAccess.getX() + " Y:" + eAccess.getY() + " Z:" + eAccess.getZ(),
|
|
||||||
"?" + eAccess.getX() + " " + eAccess.getY() + " " + eAccess.getZ()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -1,24 +1,18 @@
|
|||||||
package carpet.helpers;
|
package carpet.helpers;
|
||||||
|
|
||||||
import carpet.script.utils.ParticleParser;
|
|
||||||
import net.minecraft.core.HolderLookup;
|
|
||||||
import net.minecraft.core.particles.ParticleOptions;
|
import net.minecraft.core.particles.ParticleOptions;
|
||||||
import net.minecraft.core.particles.ParticleType;
|
|
||||||
import net.minecraft.core.registries.Registries;
|
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
import net.minecraft.world.phys.Vec3;
|
import net.minecraft.world.phys.Vec3;
|
||||||
|
|
||||||
public class ParticleDisplay
|
public class ParticleDisplay
|
||||||
{
|
{
|
||||||
public static void drawParticleLine(ServerPlayer player, Vec3 from, Vec3 to, String main, String accent, int count, double spread)
|
public static void drawParticleLine(ServerPlayer player, Vec3 from, Vec3 to, ParticleOptions mainParticle, ParticleOptions accentParticle, int count, double spread)
|
||||||
{
|
{
|
||||||
ParticleOptions accentParticle = ParticleParser.getEffect(accent, player.server.registryAccess());
|
|
||||||
ParticleOptions mainParticle = ParticleParser.getEffect(main, player.server.registryAccess());
|
|
||||||
|
|
||||||
if (accentParticle != null) player.serverLevel().sendParticles(
|
if (accentParticle != null) player.level().sendParticles(
|
||||||
player,
|
player,
|
||||||
accentParticle,
|
accentParticle,
|
||||||
true,
|
true, true,
|
||||||
to.x, to.y, to.z, count,
|
to.x, to.y, to.z, count,
|
||||||
spread, spread, spread, 0.0);
|
spread, spread, spread, 0.0);
|
||||||
|
|
||||||
@@ -30,10 +24,10 @@ public class ParticleDisplay
|
|||||||
delta.lengthSqr() < lineLengthSq;
|
delta.lengthSqr() < lineLengthSq;
|
||||||
delta = delta.add(incvec.scale(player.level().random.nextFloat())))
|
delta = delta.add(incvec.scale(player.level().random.nextFloat())))
|
||||||
{
|
{
|
||||||
player.serverLevel().sendParticles(
|
player.level().sendParticles(
|
||||||
player,
|
player,
|
||||||
mainParticle,
|
mainParticle,
|
||||||
true,
|
true, true,
|
||||||
delta.x+from.x, delta.y+from.y, delta.z+from.z, 1,
|
delta.x+from.x, delta.y+from.y, delta.z+from.z, 1,
|
||||||
0.0, 0.0, 0.0, 0.0);
|
0.0, 0.0, 0.0, 0.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -676,7 +676,7 @@ public class RedstoneWireTurbo
|
|||||||
// call BlockStateBase#neighborChanged directly. This change mostly
|
// call BlockStateBase#neighborChanged directly. This change mostly
|
||||||
// restores old behavior, at the cost of bypassing the
|
// restores old behavior, at the cost of bypassing the
|
||||||
// max-chained-neighbor-updates server property.
|
// max-chained-neighbor-updates server property.
|
||||||
worldIn.getBlockState(upd.self).handleNeighborChanged(worldIn, upd.self, wire, upd.parent, false);
|
worldIn.getBlockState(upd.self).handleNeighborChanged(worldIn, upd.self, wire, null, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -951,7 +951,7 @@ public class RedstoneWireTurbo
|
|||||||
BlockPos neighborPos = pos.relative(dir);
|
BlockPos neighborPos = pos.relative(dir);
|
||||||
BlockState neighborState = level.getBlockState(neighborPos);
|
BlockState neighborState = level.getBlockState(neighborPos);
|
||||||
|
|
||||||
BlockState newState = neighborState.updateShape(dir.getOpposite(), state, level, neighborPos, pos);
|
BlockState newState = neighborState.updateShape(level, level, neighborPos, dir.getOpposite(), pos, state, level.getRandom());
|
||||||
Block.updateOrDestroy(neighborState, newState, level, neighborPos, Block.UPDATE_CLIENTS);
|
Block.updateOrDestroy(neighborState, newState, level, neighborPos, Block.UPDATE_CLIENTS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ public class ExplosionLogHelper
|
|||||||
messages.add(c((k.pos.equals(pos))?"r - TNT":"w - ",
|
messages.add(c((k.pos.equals(pos))?"r - TNT":"w - ",
|
||||||
Messenger.dblt((k.pos.equals(pos))?"r":"y", k.pos.x, k.pos.y, k.pos.z), "w dV",
|
Messenger.dblt((k.pos.equals(pos))?"r":"y", k.pos.x, k.pos.y, k.pos.z), "w dV",
|
||||||
Messenger.dblt("d", k.accel.x, k.accel.y, k.accel.z),
|
Messenger.dblt("d", k.accel.x, k.accel.y, k.accel.z),
|
||||||
"w "+ regs.registryOrThrow(Registries.ENTITY_TYPE).getKey(k.type).getPath(), (v>1)?"l ("+v+")":""
|
"w "+ regs.lookupOrThrow(Registries.ENTITY_TYPE).getKey(k.type).getPath(), (v>1)?"l ("+v+")":""
|
||||||
));
|
));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,9 @@ package carpet.logging.logHelpers;
|
|||||||
|
|
||||||
import carpet.helpers.ParticleDisplay;
|
import carpet.helpers.ParticleDisplay;
|
||||||
import carpet.logging.LoggerRegistry;
|
import carpet.logging.LoggerRegistry;
|
||||||
|
import net.minecraft.core.particles.DustParticleOptions;
|
||||||
|
import net.minecraft.core.particles.ParticleOptions;
|
||||||
|
import net.minecraft.core.particles.ParticleTypes;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import net.minecraft.world.phys.Vec3;
|
import net.minecraft.world.phys.Vec3;
|
||||||
@@ -31,8 +34,8 @@ public class PathfindingVisualizer
|
|||||||
if (minDuration < 1)
|
if (minDuration < 1)
|
||||||
minDuration = 1;
|
minDuration = 1;
|
||||||
|
|
||||||
String accent = successful ? "happy_villager" : "angry_villager";
|
ParticleOptions accent = successful ? ParticleTypes.HAPPY_VILLAGER : ParticleTypes.ANGRY_VILLAGER;
|
||||||
String color = (miliseconds/minDuration < 2)? "dust 1 1 0 1" : ((miliseconds/minDuration < 4)?"dust 1 0.5 0 1":"dust 1 0 0 1");
|
ParticleOptions color = (miliseconds/minDuration < 2)? new DustParticleOptions(0xffffff00, 1) : ((miliseconds/minDuration < 4)?new DustParticleOptions(0xFFFF7700, 1): new DustParticleOptions(0xFFFF0000, 1));
|
||||||
ParticleDisplay.drawParticleLine((ServerPlayer) player, entity.position(), target, color, accent, 5, 0.5);
|
ParticleDisplay.drawParticleLine((ServerPlayer) player, entity.position(), target, color, accent, 5, 0.5);
|
||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
package carpet.mixins;
|
|
||||||
|
|
||||||
import carpet.CarpetSettings;
|
|
||||||
import net.minecraft.core.BlockPos;
|
|
||||||
import net.minecraft.core.cauldron.CauldronInteraction;
|
|
||||||
import net.minecraft.world.InteractionHand;
|
|
||||||
import net.minecraft.world.ItemInteractionResult;
|
|
||||||
import net.minecraft.world.entity.player.Player;
|
|
||||||
import net.minecraft.world.item.BlockItem;
|
|
||||||
import net.minecraft.world.item.ItemStack;
|
|
||||||
import net.minecraft.world.level.Level;
|
|
||||||
import net.minecraft.world.level.block.AbstractCauldronBlock;
|
|
||||||
import net.minecraft.world.level.block.ShulkerBoxBlock;
|
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
|
||||||
|
|
||||||
@Mixin(AbstractCauldronBlock.class)
|
|
||||||
public class AbstractCauldronBlock_stackableSBoxesMixin
|
|
||||||
{
|
|
||||||
@Redirect(method = "useItemOn", at = @At(
|
|
||||||
value = "INVOKE",
|
|
||||||
target = "Lnet/minecraft/core/cauldron/CauldronInteraction;interact(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/InteractionHand;Lnet/minecraft/world/item/ItemStack;)Lnet/minecraft/world/ItemInteractionResult;"
|
|
||||||
))
|
|
||||||
private ItemInteractionResult wrapInteractor(final CauldronInteraction cauldronBehavior, final BlockState blockState, final Level world, final BlockPos blockPos, final Player playerEntity, final InteractionHand hand, final ItemStack itemStack)
|
|
||||||
{
|
|
||||||
int count = -1;
|
|
||||||
if (CarpetSettings.shulkerBoxStackSize > 1 && itemStack.getItem() instanceof BlockItem && ((BlockItem)itemStack.getItem()).getBlock() instanceof ShulkerBoxBlock)
|
|
||||||
count = itemStack.getCount();
|
|
||||||
ItemInteractionResult result = cauldronBehavior.interact(blockState, world, blockPos, playerEntity, hand, itemStack);
|
|
||||||
if (count > 0 && result.consumesAction())
|
|
||||||
{
|
|
||||||
ItemStack current = playerEntity.getItemInHand(hand);
|
|
||||||
if (current.getItem() instanceof BlockItem && ((BlockItem)itemStack.getItem()).getBlock() instanceof ShulkerBoxBlock)
|
|
||||||
current.setCount(count);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package carpet.mixins;
|
||||||
|
|
||||||
|
import carpet.fakes.AbstractContainerMenuInterface;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
|
import net.minecraft.world.entity.player.Inventory;
|
||||||
|
import net.minecraft.world.inventory.AbstractCraftingMenu;
|
||||||
|
import net.minecraft.world.inventory.RecipeBookMenu;
|
||||||
|
import net.minecraft.world.item.crafting.RecipeHolder;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
|
@Mixin(AbstractCraftingMenu.class)
|
||||||
|
public class AbstractCraftingMenu_scarpetMixin
|
||||||
|
{
|
||||||
|
@Inject(method = "handlePlacement",at = @At("HEAD"), cancellable = true)
|
||||||
|
private void selectRecipeCallback(boolean craftAll, boolean b, RecipeHolder<?> recipe, ServerLevel serverLevel, Inventory player, CallbackInfoReturnable<RecipeBookMenu.PostPlaceAction> cir) {
|
||||||
|
if(((AbstractContainerMenuInterface) this).callSelectRecipeListener((ServerPlayer) player.player ,recipe,craftAll))
|
||||||
|
cir.setReturnValue(RecipeBookMenu.PostPlaceAction.NOTHING);
|
||||||
|
}
|
||||||
|
}
|
||||||
+10
-6
@@ -1,19 +1,23 @@
|
|||||||
package carpet.mixins;
|
package carpet.mixins;
|
||||||
|
|
||||||
import carpet.fakes.AbstractContainerMenuInterface;
|
import carpet.fakes.AbstractContainerMenuInterface;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
|
import net.minecraft.world.entity.player.Inventory;
|
||||||
|
import net.minecraft.world.inventory.AbstractFurnaceMenu;
|
||||||
import net.minecraft.world.inventory.RecipeBookMenu;
|
import net.minecraft.world.inventory.RecipeBookMenu;
|
||||||
import net.minecraft.world.item.crafting.RecipeHolder;
|
import net.minecraft.world.item.crafting.RecipeHolder;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
@Mixin(RecipeBookMenu.class)
|
@Mixin(AbstractFurnaceMenu.class)
|
||||||
public class RecipeBookMenu_scarpetMixin {
|
public class AbstractFurnaceMenu_scarpetMixin
|
||||||
|
{
|
||||||
@Inject(method = "handlePlacement",at = @At("HEAD"), cancellable = true)
|
@Inject(method = "handlePlacement",at = @At("HEAD"), cancellable = true)
|
||||||
private void selectRecipeCallback(boolean craftAll, RecipeHolder<?> recipe, ServerPlayer player, CallbackInfo ci) {
|
private void selectRecipeCallback(boolean craftAll, boolean b, RecipeHolder<?> recipe, ServerLevel level, Inventory player, CallbackInfoReturnable<RecipeBookMenu.PostPlaceAction> cir) {
|
||||||
if(((AbstractContainerMenuInterface) this).callSelectRecipeListener(player,recipe,craftAll))
|
if(((AbstractContainerMenuInterface) this).callSelectRecipeListener((ServerPlayer) player.player ,recipe,craftAll))
|
||||||
ci.cancel();
|
cir.setReturnValue(RecipeBookMenu.PostPlaceAction.NOTHING);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,6 +4,7 @@ import carpet.CarpetSettings;
|
|||||||
import carpet.fakes.LevelInterface;
|
import carpet.fakes.LevelInterface;
|
||||||
import net.minecraft.world.level.redstone.NeighborUpdater;
|
import net.minecraft.world.level.redstone.NeighborUpdater;
|
||||||
import net.minecraft.util.RandomSource;
|
import net.minecraft.util.RandomSource;
|
||||||
|
import net.minecraft.world.level.redstone.Orientation;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
@@ -29,10 +30,10 @@ public class BarrierBlock_updateSuppressionBlockMixin extends Block {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, boolean notify) {
|
public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, Orientation fromPos, boolean notify) {
|
||||||
if (CarpetSettings.updateSuppressionBlock != -1) {
|
if (CarpetSettings.updateSuppressionBlock != -1) {
|
||||||
if (fromPos.equals(pos.above())) {
|
if (true/*fromPos.equals(pos.above())*/) { // todo neighbour updates don't have source
|
||||||
BlockState stateAbove = level.getBlockState(fromPos);
|
BlockState stateAbove = level.getBlockState(pos.above());
|
||||||
if (stateAbove.is(Blocks.ACTIVATOR_RAIL) && !stateAbove.getValue(PoweredRailBlock.POWERED)) {
|
if (stateAbove.is(Blocks.ACTIVATOR_RAIL) && !stateAbove.getValue(PoweredRailBlock.POWERED)) {
|
||||||
level.scheduleTick(pos, this, 1);
|
level.scheduleTick(pos, this, 1);
|
||||||
NeighborUpdater updater = ((LevelInterface)level).getNeighborUpdater();
|
NeighborUpdater updater = ((LevelInterface)level).getNeighborUpdater();
|
||||||
|
|||||||
@@ -3,10 +3,10 @@ package carpet.mixins;
|
|||||||
import carpet.CarpetSettings;
|
import carpet.CarpetSettings;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.core.registries.Registries;
|
import net.minecraft.core.registries.Registries;
|
||||||
|
import net.minecraft.tags.ItemTags;
|
||||||
import net.minecraft.world.entity.player.Player;
|
import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.item.PickaxeItem;
|
|
||||||
import net.minecraft.world.item.enchantment.EnchantmentHelper;
|
import net.minecraft.world.item.enchantment.EnchantmentHelper;
|
||||||
import net.minecraft.world.item.enchantment.Enchantments;
|
import net.minecraft.world.item.enchantment.Enchantments;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
@@ -14,12 +14,8 @@ import net.minecraft.world.level.block.Block;
|
|||||||
import net.minecraft.world.level.block.BuddingAmethystBlock;
|
import net.minecraft.world.level.block.BuddingAmethystBlock;
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.level.material.PushReaction;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
|
||||||
|
|
||||||
@Mixin(BuddingAmethystBlock.class)
|
@Mixin(BuddingAmethystBlock.class)
|
||||||
public class BuddingAmethystBlock_movableAmethystMixin extends Block {
|
public class BuddingAmethystBlock_movableAmethystMixin extends Block {
|
||||||
@@ -33,8 +29,8 @@ public class BuddingAmethystBlock_movableAmethystMixin extends Block {
|
|||||||
// doing it here rather than though loottables since loottables are loaded on reload
|
// doing it here rather than though loottables since loottables are loaded on reload
|
||||||
// drawback - not controlled via loottables, but hey
|
// drawback - not controlled via loottables, but hey
|
||||||
if (CarpetSettings.movableAmethyst &&
|
if (CarpetSettings.movableAmethyst &&
|
||||||
stack.getItem() instanceof PickaxeItem &&
|
stack.is(ItemTags.PICKAXES) &&
|
||||||
EnchantmentHelper.getItemEnchantmentLevel(world.registryAccess().registryOrThrow(Registries.ENCHANTMENT).getHolderOrThrow(Enchantments.SILK_TOUCH), stack) > 0
|
EnchantmentHelper.getItemEnchantmentLevel(world.registryAccess().lookupOrThrow(Registries.ENCHANTMENT).getOrThrow(Enchantments.SILK_TOUCH), stack) > 0
|
||||||
)
|
)
|
||||||
popResource(world, pos, Items.BUDDING_AMETHYST.getDefaultInstance());
|
popResource(world, pos, Items.BUDDING_AMETHYST.getDefaultInstance());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package carpet.mixins;
|
|||||||
import carpet.utils.SpawnOverrides;
|
import carpet.utils.SpawnOverrides;
|
||||||
import it.unimi.dsi.fastutil.longs.LongSet;
|
import it.unimi.dsi.fastutil.longs.LongSet;
|
||||||
import net.minecraft.core.Holder;
|
import net.minecraft.core.Holder;
|
||||||
|
import net.minecraft.util.random.WeightedList;
|
||||||
import net.minecraft.world.level.StructureManager;
|
import net.minecraft.world.level.StructureManager;
|
||||||
import net.minecraft.world.level.levelgen.structure.Structure;
|
import net.minecraft.world.level.levelgen.structure.Structure;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
@@ -11,7 +12,6 @@ import org.spongepowered.asm.mixin.injection.Inject;
|
|||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.util.random.WeightedRandomList;
|
|
||||||
import net.minecraft.world.entity.MobCategory;
|
import net.minecraft.world.entity.MobCategory;
|
||||||
import net.minecraft.world.level.biome.Biome;
|
import net.minecraft.world.level.biome.Biome;
|
||||||
import net.minecraft.world.level.biome.MobSpawnSettings;
|
import net.minecraft.world.level.biome.MobSpawnSettings;
|
||||||
@@ -31,10 +31,10 @@ public abstract class ChunkGenerator_customMobSpawnsMixin
|
|||||||
target = "Ljava/util/Map$Entry;getKey()Ljava/lang/Object;"
|
target = "Ljava/util/Map$Entry;getKey()Ljava/lang/Object;"
|
||||||
), cancellable = true)
|
), cancellable = true)
|
||||||
private void checkCMSpawns(Holder<Biome> holder, StructureManager structureFeatureManager, MobCategory mobCategory, BlockPos blockPos,
|
private void checkCMSpawns(Holder<Biome> holder, StructureManager structureFeatureManager, MobCategory mobCategory, BlockPos blockPos,
|
||||||
CallbackInfoReturnable<WeightedRandomList<MobSpawnSettings.SpawnerData>> cir,
|
CallbackInfoReturnable<WeightedList<MobSpawnSettings.SpawnerData>> cir,
|
||||||
Map<Structure, LongSet> map, Iterator<?> var6, Map.Entry<Structure, LongSet> entry)
|
Map<Structure, LongSet> map, Iterator<?> var6, Map.Entry<Structure, LongSet> entry)
|
||||||
{
|
{
|
||||||
WeightedRandomList<MobSpawnSettings.SpawnerData> res = SpawnOverrides.test(structureFeatureManager, entry.getValue(), mobCategory, entry.getKey(), blockPos);
|
WeightedList<MobSpawnSettings.SpawnerData> res = SpawnOverrides.test(structureFeatureManager, entry.getValue(), mobCategory, entry.getKey(), blockPos);
|
||||||
if (res != null)
|
if (res != null)
|
||||||
{
|
{
|
||||||
cir.setReturnValue(res);
|
cir.setReturnValue(res);
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ import net.minecraft.server.level.ChunkLevel;
|
|||||||
import net.minecraft.server.level.ChunkMap;
|
import net.minecraft.server.level.ChunkMap;
|
||||||
import net.minecraft.server.level.ChunkMap.DistanceManager;
|
import net.minecraft.server.level.ChunkMap.DistanceManager;
|
||||||
import net.minecraft.server.level.ChunkResult;
|
import net.minecraft.server.level.ChunkResult;
|
||||||
import net.minecraft.server.level.ChunkTaskPriorityQueueSorter;
|
//import net.minecraft.server.level.ChunkTaskPriorityQueueSorter;
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.server.level.ThreadedLevelLightEngine;
|
import net.minecraft.server.level.ThreadedLevelLightEngine;
|
||||||
import net.minecraft.server.level.TicketType;
|
import net.minecraft.server.level.TicketType;
|
||||||
@@ -46,7 +46,6 @@ import org.spongepowered.asm.mixin.injection.Inject;
|
|||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
import carpet.fakes.ChunkHolderInterface;
|
import carpet.fakes.ChunkHolderInterface;
|
||||||
import carpet.fakes.ChunkTicketManagerInterface;
|
|
||||||
import carpet.fakes.ServerLightingProviderInterface;
|
import carpet.fakes.ServerLightingProviderInterface;
|
||||||
import carpet.fakes.ThreadedAnvilChunkStorageInterface;
|
import carpet.fakes.ThreadedAnvilChunkStorageInterface;
|
||||||
import carpet.script.utils.WorldTools;
|
import carpet.script.utils.WorldTools;
|
||||||
@@ -76,9 +75,9 @@ public abstract class ChunkMap_scarpetChunkCreationMixin implements ThreadedAnvi
|
|||||||
@Final
|
@Final
|
||||||
private ThreadedLevelLightEngine lightEngine;
|
private ThreadedLevelLightEngine lightEngine;
|
||||||
|
|
||||||
@Shadow
|
//@Shadow
|
||||||
@Final
|
//@Final
|
||||||
private ChunkTaskPriorityQueueSorter queueSorter;
|
//private ChunkTaskPriorityQueueSorter queueSorter;
|
||||||
|
|
||||||
@Shadow
|
@Shadow
|
||||||
@Final
|
@Final
|
||||||
@@ -165,7 +164,6 @@ public abstract class ChunkMap_scarpetChunkCreationMixin implements ThreadedAnvi
|
|||||||
this.world.getServer().execute(() -> CHUNK_LOADED.onChunkEvent(this.world, chpos, generated));
|
this.world.getServer().execute(() -> CHUNK_LOADED.onChunkEvent(this.world, chpos, generated));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
@Unique
|
@Unique
|
||||||
private void addTicket(ChunkPos pos, ChunkStatus status)
|
private void addTicket(ChunkPos pos, ChunkStatus status)
|
||||||
@@ -180,7 +178,6 @@ public abstract class ChunkMap_scarpetChunkCreationMixin implements ThreadedAnvi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
@Unique
|
@Unique
|
||||||
private void addRelightTicket(ChunkPos pos)
|
private void addRelightTicket(ChunkPos pos)
|
||||||
{
|
{
|
||||||
@@ -195,7 +192,7 @@ public abstract class ChunkMap_scarpetChunkCreationMixin implements ThreadedAnvi
|
|||||||
() -> "release relight ticket " + pos
|
() -> "release relight ticket " + pos
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
@Unique
|
@Unique
|
||||||
private void tickTicketManager()
|
private void tickTicketManager()
|
||||||
{
|
{
|
||||||
@@ -220,7 +217,7 @@ public abstract class ChunkMap_scarpetChunkCreationMixin implements ThreadedAnvi
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
@Unique
|
@Unique
|
||||||
private Set<ChunkPos> loadExistingChunksFromDisk(Set<ChunkPos> requestedChunks)
|
private Set<ChunkPos> loadExistingChunksFromDisk(Set<ChunkPos> requestedChunks)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ public abstract class ClientPacketListener_clientCommandMixin extends ClientComm
|
|||||||
if (CarpetServer.minecraft_server == null && !CarpetClient.isCarpet() && minecraft.player != null)
|
if (CarpetServer.minecraft_server == null && !CarpetClient.isCarpet() && minecraft.player != null)
|
||||||
{
|
{
|
||||||
LocalPlayer playerSource = minecraft.player;
|
LocalPlayer playerSource = minecraft.player;
|
||||||
CarpetServer.forEachManager(sm -> sm.inspectClientsideCommand(playerSource.createCommandSourceStack(), "/" + string));
|
CarpetServer.forEachManager(sm -> sm.inspectClientsideCommand("/" + string));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
package carpet.mixins;
|
||||||
|
|
||||||
|
import carpet.CarpetSettings;
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.client.multiplayer.ClientCommonPacketListenerImpl;
|
||||||
|
import net.minecraft.client.multiplayer.ClientPacketListener;
|
||||||
|
import net.minecraft.client.multiplayer.CommonListenerCookie;
|
||||||
|
import net.minecraft.network.Connection;
|
||||||
|
import net.minecraft.network.protocol.game.ClientboundExplodePacket;
|
||||||
|
import net.minecraft.world.phys.Vec3;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
@Mixin(ClientPacketListener.class)
|
||||||
|
public abstract class ClientPacketListener_explosionMixin extends ClientCommonPacketListenerImpl
|
||||||
|
{
|
||||||
|
|
||||||
|
private static Vec3 vec3dmem;
|
||||||
|
private static long tickmem;
|
||||||
|
// For disabling the explosion particles and sounds if explosions are stacking up
|
||||||
|
|
||||||
|
protected ClientPacketListener_explosionMixin(final Minecraft minecraft, final Connection connection, final CommonListenerCookie commonListenerCookie)
|
||||||
|
{
|
||||||
|
super(minecraft, connection, commonListenerCookie);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Inject(method = "handleExplosion", at = @At(
|
||||||
|
value = "INVOKE",
|
||||||
|
target = "Lnet/minecraft/client/multiplayer/ClientLevel;playLocalSound(DDDLnet/minecraft/sounds/SoundEvent;Lnet/minecraft/sounds/SoundSource;FFZ)V"
|
||||||
|
), cancellable = true)
|
||||||
|
private void onHandleExplosion(final ClientboundExplodePacket clientboundExplodePacket, final CallbackInfo ci)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (CarpetSettings.optimizedTNT)
|
||||||
|
{
|
||||||
|
Vec3 vec3d = clientboundExplodePacket.center();
|
||||||
|
long tick = minecraft.level.getGameTime();
|
||||||
|
if (vec3dmem == null || !vec3dmem.equals(vec3d) || tickmem != tick) {
|
||||||
|
vec3dmem = vec3d;
|
||||||
|
tickmem = tick;
|
||||||
|
} else {
|
||||||
|
ci.cancel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@ import net.minecraft.core.BlockPos;
|
|||||||
import net.minecraft.server.commands.CloneCommands;
|
import net.minecraft.server.commands.CloneCommands;
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.world.level.block.Block;
|
import net.minecraft.world.level.block.Block;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
@@ -14,10 +15,10 @@ public abstract class CloneCommands_fillUpdatesMixin
|
|||||||
{
|
{
|
||||||
@Redirect(method = "clone", at = @At(
|
@Redirect(method = "clone", at = @At(
|
||||||
value = "INVOKE",
|
value = "INVOKE",
|
||||||
target = "Lnet/minecraft/server/level/ServerLevel;blockUpdated(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/Block;)V"
|
target = "Lnet/minecraft/server/level/ServerLevel;updateNeighboursOnBlockSet(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)V"
|
||||||
))
|
))
|
||||||
private static void conditionalUpdating(ServerLevel serverWorld, BlockPos blockPos_1, Block block_1)
|
private static void conditionalUpdating(ServerLevel serverWorld, BlockPos blockPos_1, BlockState block_1)
|
||||||
{
|
{
|
||||||
if (CarpetSettings.fillUpdates) serverWorld.blockUpdated(blockPos_1, block_1);
|
if (CarpetSettings.fillUpdates) serverWorld.updateNeighboursOnBlockSet(blockPos_1, block_1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3,6 +3,7 @@ package carpet.mixins;
|
|||||||
import carpet.fakes.ClientConnectionInterface;
|
import carpet.fakes.ClientConnectionInterface;
|
||||||
import carpet.logging.logHelpers.PacketCounter;
|
import carpet.logging.logHelpers.PacketCounter;
|
||||||
import io.netty.channel.Channel;
|
import io.netty.channel.Channel;
|
||||||
|
import io.netty.channel.ChannelFutureListener;
|
||||||
import io.netty.channel.ChannelHandlerContext;
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
import io.netty.util.concurrent.Future;
|
import io.netty.util.concurrent.Future;
|
||||||
import io.netty.util.concurrent.GenericFutureListener;
|
import io.netty.util.concurrent.GenericFutureListener;
|
||||||
@@ -28,7 +29,7 @@ public abstract class Connection_packetCounterMixin implements ClientConnectionI
|
|||||||
|
|
||||||
// Add to the packet counter whenever a packet is sent.
|
// Add to the packet counter whenever a packet is sent.
|
||||||
@Inject(method = "sendPacket", at = @At("HEAD"))
|
@Inject(method = "sendPacket", at = @At("HEAD"))
|
||||||
private void packetOutCount(final Packet<?> packet, final PacketSendListener packetSendListener, final boolean bl, final CallbackInfo ci)
|
private void packetOutCount(Packet<?> packet, ChannelFutureListener channelFutureListener, boolean bl, CallbackInfo ci)
|
||||||
{
|
{
|
||||||
PacketCounter.totalOut++;
|
PacketCounter.totalOut++;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package carpet.mixins;
|
||||||
|
|
||||||
|
import carpet.fakes.DefaultRedstoneWireEvaluatorInferface;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.world.level.Level;
|
||||||
|
import net.minecraft.world.level.redstone.DefaultRedstoneWireEvaluator;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
||||||
|
@Mixin(DefaultRedstoneWireEvaluator.class)
|
||||||
|
public abstract class DefaultRedstoneWireEvaluator_redstoneMixin implements DefaultRedstoneWireEvaluatorInferface
|
||||||
|
{
|
||||||
|
@Shadow protected abstract int calculateTargetStrength(final Level level, final BlockPos blockPos);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int calculateTargetStrengthCM(final Level level, final BlockPos pos)
|
||||||
|
{
|
||||||
|
return calculateTargetStrength(level, pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package carpet.mixins;
|
package carpet.mixins;
|
||||||
|
|
||||||
|
import net.minecraft.world.level.redstone.Orientation;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
@@ -23,7 +24,7 @@ public class DispenserBlock_qcMixin {
|
|||||||
target = "Lnet/minecraft/world/level/Level;hasNeighborSignal(Lnet/minecraft/core/BlockPos;)Z"
|
target = "Lnet/minecraft/world/level/Level;hasNeighborSignal(Lnet/minecraft/core/BlockPos;)Z"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
private boolean carpet_hasQuasiSignal(Level _level, BlockPos above, BlockState state, Level level, BlockPos pos, Block neighborBlock, BlockPos neighborPos, boolean movedByPiston) {
|
private boolean carpet_hasQuasiSignal(Level _level, BlockPos above, BlockState state, Level level, BlockPos pos, Block neighborBlock, Orientation neighborPos, boolean movedByPiston) {
|
||||||
return QuasiConnectivity.hasQuasiSignal(level, pos);
|
return QuasiConnectivity.hasQuasiSignal(level, pos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
package carpet.mixins;
|
|
||||||
|
|
||||||
import java.util.Set;
|
|
||||||
import net.minecraft.server.level.ChunkHolder;
|
|
||||||
import net.minecraft.server.level.DistanceManager;
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
|
|
||||||
import carpet.fakes.ChunkTicketManagerInterface;
|
|
||||||
|
|
||||||
@Mixin(DistanceManager.class)
|
|
||||||
public abstract class DistanceManager_scarpetChunkCreationMixin implements ChunkTicketManagerInterface
|
|
||||||
{
|
|
||||||
@Shadow
|
|
||||||
@Final
|
|
||||||
private Set<ChunkHolder> chunksToUpdateFutures;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void replaceHolder(final ChunkHolder oldHolder, final ChunkHolder newHolder)
|
|
||||||
{
|
|
||||||
this.chunksToUpdateFutures.remove(oldHolder);
|
|
||||||
this.chunksToUpdateFutures.add(newHolder);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,23 +1,25 @@
|
|||||||
package carpet.mixins;
|
package carpet.mixins;
|
||||||
|
|
||||||
import carpet.fakes.ChunkTicketManagerInterface;
|
import carpet.fakes.TicketsFetcherInterface;
|
||||||
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
|
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
|
||||||
import net.minecraft.server.level.DistanceManager;
|
import net.minecraft.server.level.DistanceManager;
|
||||||
import net.minecraft.server.level.Ticket;
|
import net.minecraft.server.level.Ticket;
|
||||||
import net.minecraft.util.SortedArraySet;
|
import net.minecraft.world.level.TicketStorage;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Mixin(DistanceManager.class)
|
@Mixin(DistanceManager.class)
|
||||||
public abstract class DistanceManager_scarpetMixin implements ChunkTicketManagerInterface
|
public abstract class DistanceManager_scarpetMixin implements TicketsFetcherInterface
|
||||||
{
|
{
|
||||||
@Shadow @Final private Long2ObjectOpenHashMap<SortedArraySet<Ticket<?>>> tickets;
|
@Shadow @Final private TicketStorage ticketStorage;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Long2ObjectOpenHashMap<SortedArraySet<Ticket<?>>> getTicketsByPosition()
|
public Long2ObjectOpenHashMap<List<Ticket>> getTicketsByPosition()
|
||||||
{
|
{
|
||||||
return tickets;
|
return ((TicketsFetcherInterface)ticketStorage).getTicketsByPosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
package carpet.mixins;
|
|
||||||
|
|
||||||
import carpet.fakes.ChunkTicketManagerInterface;
|
|
||||||
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
|
|
||||||
import net.minecraft.server.level.DistanceManager;
|
|
||||||
import net.minecraft.server.level.Ticket;
|
|
||||||
import net.minecraft.server.level.TicketType;
|
|
||||||
import net.minecraft.util.SortedArraySet;
|
|
||||||
import net.minecraft.util.Unit;
|
|
||||||
import net.minecraft.world.level.ChunkPos;
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
|
|
||||||
import java.util.Iterator;
|
|
||||||
|
|
||||||
@Mixin(DistanceManager.class)
|
|
||||||
public abstract class DistanceManager_spawnChunksMixin implements ChunkTicketManagerInterface
|
|
||||||
{
|
|
||||||
@Shadow @Final private Long2ObjectOpenHashMap<SortedArraySet<Ticket<?>>> tickets;
|
|
||||||
|
|
||||||
@Shadow protected abstract void removeTicket(long pos, Ticket<?> ticket);
|
|
||||||
|
|
||||||
@Shadow public abstract <T> void addRegionTicket(TicketType<T> type, ChunkPos pos, int radius, T argument);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void changeSpawnChunks(ChunkPos chunkPos, int distance)
|
|
||||||
{
|
|
||||||
long pos = chunkPos.toLong();
|
|
||||||
SortedArraySet<Ticket<?>> set = tickets.get(pos);
|
|
||||||
Ticket<?> existingTicket = null;
|
|
||||||
if (set != null)
|
|
||||||
{
|
|
||||||
Iterator<Ticket<?>> iter = set.iterator();
|
|
||||||
while(iter.hasNext())
|
|
||||||
{
|
|
||||||
Ticket<?> ticket = iter.next();
|
|
||||||
if (ticket.getType() == TicketType.START)
|
|
||||||
{
|
|
||||||
existingTicket = ticket;
|
|
||||||
iter.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
set.add(existingTicket);
|
|
||||||
}
|
|
||||||
// the reason we are removing the ticket this way is that there are sideeffects of removal
|
|
||||||
if (existingTicket != null)
|
|
||||||
{
|
|
||||||
removeTicket(pos, existingTicket);
|
|
||||||
}
|
|
||||||
// set optionally new spawn ticket
|
|
||||||
if (distance > 0)
|
|
||||||
addRegionTicket(TicketType.START, chunkPos, distance, Unit.INSTANCE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -32,7 +32,7 @@ public abstract class EntityMixin implements EntityInterface
|
|||||||
return partialTicks == 1.0F ? this.yRot : Mth.lerp(partialTicks, this.yRotO, this.yRot);
|
return partialTicks == 1.0F ? this.yRot : Mth.lerp(partialTicks, this.yRotO, this.yRot);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "isControlledByLocalInstance", at = @At("HEAD"), cancellable = true)
|
@Inject(method = "isLocalInstanceAuthoritative", at = @At("HEAD"), cancellable = true)
|
||||||
private void isFakePlayer(CallbackInfoReturnable<Boolean> cir)
|
private void isFakePlayer(CallbackInfoReturnable<Boolean> cir)
|
||||||
{
|
{
|
||||||
if (getControllingPassenger() instanceof EntityPlayerMPFake) cir.setReturnValue(!level.isClientSide);
|
if (getControllingPassenger() instanceof EntityPlayerMPFake) cir.setReturnValue(!level.isClientSide);
|
||||||
|
|||||||
@@ -19,9 +19,6 @@ public abstract class ExperienceOrb_xpNoCooldownMixin extends Entity
|
|||||||
@Shadow
|
@Shadow
|
||||||
private int count;
|
private int count;
|
||||||
|
|
||||||
@Shadow
|
|
||||||
private int value;
|
|
||||||
|
|
||||||
public ExperienceOrb_xpNoCooldownMixin(EntityType<?> type, Level world)
|
public ExperienceOrb_xpNoCooldownMixin(EntityType<?> type, Level world)
|
||||||
{
|
{
|
||||||
super(type, world);
|
super(type, world);
|
||||||
@@ -30,13 +27,15 @@ public abstract class ExperienceOrb_xpNoCooldownMixin extends Entity
|
|||||||
@Shadow
|
@Shadow
|
||||||
protected abstract int repairPlayerItems(ServerPlayer player, int amount);
|
protected abstract int repairPlayerItems(ServerPlayer player, int amount);
|
||||||
|
|
||||||
|
@Shadow public abstract int getValue();
|
||||||
|
|
||||||
@Inject(method = "playerTouch", at = @At("HEAD"))
|
@Inject(method = "playerTouch", at = @At("HEAD"))
|
||||||
private void addXP(Player player, CallbackInfo ci) {
|
private void addXP(Player player, CallbackInfo ci) {
|
||||||
if (CarpetSettings.xpNoCooldown && !level().isClientSide) {
|
if (CarpetSettings.xpNoCooldown && !level().isClientSide) {
|
||||||
player.takeXpDelay = 0;
|
player.takeXpDelay = 0;
|
||||||
// reducing the count to 1 and leaving vanilla to deal with it
|
// reducing the count to 1 and leaving vanilla to deal with it
|
||||||
while (this.count > 1) {
|
while (this.count > 1) {
|
||||||
int remainder = this.repairPlayerItems((ServerPlayer) player, this.value);
|
int remainder = this.repairPlayerItems((ServerPlayer) player, this.getValue());
|
||||||
if (remainder > 0) {
|
if (remainder > 0) {
|
||||||
player.giveExperiencePoints(remainder);
|
player.giveExperiencePoints(remainder);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,37 +1,22 @@
|
|||||||
package carpet.mixins;
|
package carpet.mixins;
|
||||||
|
|
||||||
import net.minecraft.util.RandomSource;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.world.damagesource.DamageSource;
|
import net.minecraft.world.damagesource.DamageSource;
|
||||||
|
import net.minecraft.world.level.ServerExplosion;
|
||||||
|
import net.minecraft.world.phys.Vec3;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||||
|
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import net.minecraft.world.level.Explosion;
|
|
||||||
import net.minecraft.world.level.Level;
|
|
||||||
|
|
||||||
@Mixin(Explosion.class)
|
@Mixin(ServerExplosion.class)
|
||||||
public interface ExplosionAccessor {
|
public interface ExplosionAccessor {
|
||||||
|
|
||||||
@Accessor
|
@Accessor
|
||||||
boolean isFire();
|
ServerLevel getLevel();
|
||||||
|
|
||||||
@Accessor
|
@Accessor
|
||||||
Explosion.BlockInteraction getBlockInteraction();
|
Vec3 getCenter();
|
||||||
|
|
||||||
@Accessor
|
|
||||||
Level getLevel();
|
|
||||||
|
|
||||||
@Accessor
|
|
||||||
RandomSource getRandom();
|
|
||||||
|
|
||||||
@Accessor
|
|
||||||
double getX();
|
|
||||||
|
|
||||||
@Accessor
|
|
||||||
double getY();
|
|
||||||
|
|
||||||
@Accessor
|
|
||||||
double getZ();
|
|
||||||
|
|
||||||
@Accessor
|
@Accessor
|
||||||
float getRadius();
|
float getRadius();
|
||||||
|
|||||||
@@ -4,11 +4,12 @@ import carpet.helpers.OptimizedExplosion;
|
|||||||
import carpet.CarpetSettings;
|
import carpet.CarpetSettings;
|
||||||
import carpet.logging.LoggerRegistry;
|
import carpet.logging.LoggerRegistry;
|
||||||
import carpet.logging.logHelpers.ExplosionLogHelper;
|
import carpet.logging.logHelpers.ExplosionLogHelper;
|
||||||
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.core.Holder;
|
|
||||||
import net.minecraft.core.particles.ParticleOptions;
|
|
||||||
import net.minecraft.world.entity.LivingEntity;
|
import net.minecraft.world.entity.LivingEntity;
|
||||||
import net.minecraft.world.entity.monster.breeze.Breeze;
|
import net.minecraft.world.entity.monster.breeze.Breeze;
|
||||||
|
import net.minecraft.world.level.BlockGetter;
|
||||||
|
import net.minecraft.world.level.ServerExplosion;
|
||||||
|
import net.minecraft.world.level.material.FluidState;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
@@ -23,81 +24,74 @@ import net.minecraft.world.damagesource.DamageSource;
|
|||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import net.minecraft.world.level.Explosion;
|
import net.minecraft.world.level.Explosion;
|
||||||
import net.minecraft.world.level.ExplosionDamageCalculator;
|
import net.minecraft.world.level.ExplosionDamageCalculator;
|
||||||
import net.minecraft.world.level.Level;
|
|
||||||
import net.minecraft.world.level.block.Blocks;
|
import net.minecraft.world.level.block.Blocks;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.phys.Vec3;
|
import net.minecraft.world.phys.Vec3;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
@Mixin(value = Explosion.class)
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@Mixin(value = ServerExplosion.class)
|
||||||
public abstract class Explosion_optimizedTntMixin
|
public abstract class Explosion_optimizedTntMixin
|
||||||
{
|
{
|
||||||
@Shadow
|
@Shadow @Final private ServerLevel level;
|
||||||
@Final
|
|
||||||
private ObjectArrayList<BlockPos> toBlow;
|
|
||||||
|
|
||||||
@Shadow @Final private Level level;
|
|
||||||
|
|
||||||
@Shadow @Nullable public abstract LivingEntity getIndirectSourceEntity();
|
@Shadow @Nullable public abstract LivingEntity getIndirectSourceEntity();
|
||||||
|
|
||||||
private ExplosionLogHelper eLogger;
|
private ExplosionLogHelper eLogger;
|
||||||
|
|
||||||
@Inject(method = "explode", at = @At("HEAD"),
|
@Inject(method = "calculateExplodedPositions", at = @At("HEAD"),
|
||||||
cancellable = true)
|
cancellable = true)
|
||||||
private void onExplosionA(CallbackInfo ci)
|
private void calculateExplodedPositionsCM(final CallbackInfoReturnable<List<BlockPos>> cir)
|
||||||
{
|
{
|
||||||
if (CarpetSettings.optimizedTNT && !level.isClientSide && !(getIndirectSourceEntity() instanceof Breeze))
|
if (CarpetSettings.optimizedTNT && !level.isClientSide && !(getIndirectSourceEntity() instanceof Breeze))
|
||||||
{
|
{
|
||||||
OptimizedExplosion.doExplosionA((Explosion) (Object) this, eLogger);
|
cir.setReturnValue(OptimizedExplosion.doExplosionA((Explosion) (Object) this, eLogger));
|
||||||
ci.cancel();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "finalizeExplosion", at = @At("HEAD"),
|
@Inject(method = "interactWithBlocks", at = @At("HEAD"))
|
||||||
cancellable = true)
|
private void interactWithBlocksCM(final List<BlockPos> list, final CallbackInfo ci)
|
||||||
private void onExplosionB(boolean spawnParticles, CallbackInfo ci)
|
|
||||||
{
|
{
|
||||||
if (eLogger != null)
|
if (eLogger != null)
|
||||||
{
|
{
|
||||||
eLogger.setAffectBlocks( ! toBlow.isEmpty());
|
eLogger.setAffectBlocks( ! list.isEmpty());
|
||||||
eLogger.onExplosionDone(this.level.getGameTime());
|
eLogger.onExplosionDone(this.level.getGameTime());
|
||||||
}
|
}
|
||||||
if (CarpetSettings.explosionNoBlockDamage)
|
if (CarpetSettings.explosionNoBlockDamage)
|
||||||
{
|
{
|
||||||
toBlow.clear();
|
list.clear();
|
||||||
}
|
}
|
||||||
if (CarpetSettings.optimizedTNT && !level.isClientSide && !(getIndirectSourceEntity() instanceof Breeze))
|
|
||||||
{
|
|
||||||
OptimizedExplosion.doExplosionB((Explosion) (Object) this, spawnParticles);
|
|
||||||
ci.cancel();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//optional due to Overwrite in Lithium
|
|
||||||
//should kill most checks if no block damage is requested
|
|
||||||
@Redirect(method = "explode", require = 0, at = @At(value = "INVOKE",
|
|
||||||
target ="Lnet/minecraft/world/level/Level;getBlockState(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/block/state/BlockState;"))
|
|
||||||
private BlockState noBlockCalcsWithNoBLockDamage(Level world, BlockPos pos)
|
|
||||||
{
|
|
||||||
if (CarpetSettings.explosionNoBlockDamage) return Blocks.BEDROCK.defaultBlockState();
|
|
||||||
return world.getBlockState(pos);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "<init>(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/damagesource/DamageSource;Lnet/minecraft/world/level/ExplosionDamageCalculator;DDDFZLnet/minecraft/world/level/Explosion$BlockInteraction;Lnet/minecraft/core/particles/ParticleOptions;Lnet/minecraft/core/particles/ParticleOptions;Lnet/minecraft/core/Holder;)V",
|
//optional due to Overwrite in Lithium
|
||||||
|
//should kill most checks if no block damage is requested
|
||||||
|
@Redirect(method = "calculateExplodedPositions", require = 0, at = @At(value = "INVOKE",
|
||||||
|
target ="Lnet/minecraft/world/level/ExplosionDamageCalculator;getBlockExplosionResistance(Lnet/minecraft/world/level/Explosion;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/material/FluidState;)Ljava/util/Optional;"))
|
||||||
|
private Optional<Float> noBlockCalcsWithNoBLockDamage(final ExplosionDamageCalculator instance, final Explosion explosion, final BlockGetter blockGetter, final BlockPos blockPos, final BlockState blockState, final FluidState fluidState)
|
||||||
|
{
|
||||||
|
if (CarpetSettings.explosionNoBlockDamage) return Optional.of(Blocks.BEDROCK.getExplosionResistance());
|
||||||
|
return instance.getBlockExplosionResistance(explosion, blockGetter, blockPos, blockState, fluidState);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject(method = "<init>",
|
||||||
at = @At(value = "RETURN"))
|
at = @At(value = "RETURN"))
|
||||||
private void onExplosionCreated(Level world, Entity entity, DamageSource damageSource, ExplosionDamageCalculator explosionBehavior, double x, double y, double z, float power, boolean createFire, Explosion.BlockInteraction destructionType, ParticleOptions particleOptions, ParticleOptions particleOptions2, Holder soundEvent, CallbackInfo ci)
|
private void onExplostion(ServerLevel world, Entity entity, DamageSource damageSource, final ExplosionDamageCalculator explosionBehavior, final Vec3 vec3, final float power, final boolean createFire, final Explosion.BlockInteraction destructionType, final CallbackInfo ci)
|
||||||
{
|
{
|
||||||
if (LoggerRegistry.__explosions && ! world.isClientSide)
|
if (LoggerRegistry.__explosions && ! world.isClientSide)
|
||||||
{
|
{
|
||||||
eLogger = new ExplosionLogHelper(x, y, z, power, createFire, destructionType, level.registryAccess());
|
eLogger = new ExplosionLogHelper(vec3.x, vec3.y, vec3.z, power, createFire, destructionType, level.registryAccess());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Redirect(method = "explode",
|
@Redirect(method = "hurtEntities",
|
||||||
at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;setDeltaMovement(Lnet/minecraft/world/phys/Vec3;)V"))
|
at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;push(Lnet/minecraft/world/phys/Vec3;)V"))
|
||||||
private void setVelocityAndUpdateLogging(Entity entity, Vec3 velocity)
|
private void setVelocityAndUpdateLogging(Entity entity, Vec3 velocity)
|
||||||
{
|
{
|
||||||
if (eLogger != null) {
|
if (eLogger != null) {
|
||||||
eLogger.onEntityImpacted(entity, velocity.subtract(entity.getDeltaMovement()));
|
eLogger.onEntityImpacted(entity, velocity.subtract(entity.getDeltaMovement()));
|
||||||
}
|
}
|
||||||
entity.setDeltaMovement(velocity);
|
entity.push(velocity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
package carpet.mixins;
|
package carpet.mixins;
|
||||||
|
|
||||||
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
|
import net.minecraft.world.level.ServerExplosion;
|
||||||
import net.minecraft.core.Holder;
|
|
||||||
import net.minecraft.core.particles.ParticleOptions;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
@@ -14,66 +12,48 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import net.minecraft.core.BlockPos;
|
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.world.damagesource.DamageSource;
|
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import net.minecraft.world.entity.LivingEntity;
|
import net.minecraft.world.entity.LivingEntity;
|
||||||
import net.minecraft.world.level.Explosion;
|
import net.minecraft.world.level.Explosion;
|
||||||
import net.minecraft.world.level.ExplosionDamageCalculator;
|
|
||||||
import net.minecraft.world.level.Level;
|
|
||||||
import net.minecraft.world.phys.Vec3;
|
import net.minecraft.world.phys.Vec3;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
|
||||||
|
|
||||||
import static carpet.script.CarpetEventServer.Event.EXPLOSION_OUTCOME;
|
import static carpet.script.CarpetEventServer.Event.EXPLOSION_OUTCOME;
|
||||||
|
|
||||||
@Mixin(value = Explosion.class, priority = 990)
|
@Mixin(value = ServerExplosion.class, priority = 990)
|
||||||
public abstract class Explosion_scarpetEventMixin
|
public abstract class Explosion_scarpetEventMixin
|
||||||
{
|
{
|
||||||
@Shadow @Final private Level level;
|
@Shadow @Final private ServerLevel level;
|
||||||
@Shadow @Final private double x;
|
@Shadow @Final private Vec3 center;
|
||||||
@Shadow @Final private double y;
|
|
||||||
@Shadow @Final private double z;
|
|
||||||
@Shadow @Final private float radius;
|
@Shadow @Final private float radius;
|
||||||
@Shadow @Final private boolean fire;
|
@Shadow @Final private boolean fire;
|
||||||
@Shadow @Final private ObjectArrayList<BlockPos> toBlow;
|
|
||||||
@Shadow @Final private Explosion.BlockInteraction blockInteraction;
|
@Shadow @Final private Explosion.BlockInteraction blockInteraction;
|
||||||
@Shadow @Final private @Nullable Entity source;
|
@Shadow @Final private @Nullable Entity source;
|
||||||
|
|
||||||
@Shadow /*@Nullable*/ public abstract /*@Nullable*/ LivingEntity getIndirectSourceEntity();
|
@Shadow /*@Nullable*/ public abstract /*@Nullable*/ LivingEntity getIndirectSourceEntity();
|
||||||
|
|
||||||
@Shadow public static float getSeenPercent(Vec3 source, Entity entity) {return 0.0f;}
|
private List<Entity> affectedEntities = new ArrayList<>();
|
||||||
|
|
||||||
private List<Entity> affectedEntities;
|
@Inject(method = "explode", at = @At("HEAD"))
|
||||||
|
private void explodeCM(CallbackInfo ci)
|
||||||
@Inject(method = "<init>(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/damagesource/DamageSource;Lnet/minecraft/world/level/ExplosionDamageCalculator;DDDFZLnet/minecraft/world/level/Explosion$BlockInteraction;Lnet/minecraft/core/particles/ParticleOptions;Lnet/minecraft/core/particles/ParticleOptions;Lnet/minecraft/core/Holder;)V",
|
|
||||||
at = @At(value = "RETURN"))
|
|
||||||
private void onExplosionCreated(Level world, Entity entity, DamageSource damageSource, ExplosionDamageCalculator explosionBehavior, double x, double y, double z, float power, boolean createFire, Explosion.BlockInteraction destructionType, ParticleOptions particleOptions, ParticleOptions particleOptions2, Holder soundEvent, CallbackInfo ci)
|
|
||||||
{
|
{
|
||||||
if (EXPLOSION_OUTCOME.isNeeded() && !world.isClientSide())
|
affectedEntities.clear();
|
||||||
{
|
|
||||||
affectedEntities = new ArrayList<>();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Redirect(method = "explode", at=@At(
|
@Redirect(method = "hurtEntities", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;onExplosionHit(Lnet/minecraft/world/entity/Entity;)V"))
|
||||||
value = "INVOKE",
|
private void onEntityHit(Entity instance, Entity entity)
|
||||||
target = "Lnet/minecraft/world/level/Explosion;getSeenPercent(Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/entity/Entity;)F")
|
|
||||||
)
|
|
||||||
private float onExplosion(Vec3 source, Entity entity)
|
|
||||||
{
|
{
|
||||||
if (affectedEntities != null)
|
affectedEntities.add(instance);
|
||||||
{
|
instance.onExplosionHit(entity);
|
||||||
affectedEntities.add(entity);
|
|
||||||
}
|
|
||||||
return getSeenPercent(source, entity);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "finalizeExplosion", at = @At("HEAD"))
|
@Inject(method = "explode", locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/ServerExplosion;hurtEntities()V", shift = At.Shift.AFTER))
|
||||||
private void onExplosion(boolean spawnParticles, CallbackInfo ci)
|
private void onExplosionDone(CallbackInfo ci, List list)
|
||||||
{
|
{
|
||||||
if (EXPLOSION_OUTCOME.isNeeded() && !level.isClientSide())
|
if (EXPLOSION_OUTCOME.isNeeded() && !level.isClientSide())
|
||||||
{
|
{
|
||||||
EXPLOSION_OUTCOME.onExplosion((ServerLevel) level, source, this::getIndirectSourceEntity, x, y, z, radius, fire, toBlow, affectedEntities, blockInteraction);
|
EXPLOSION_OUTCOME.onExplosion((ServerLevel) level, source, this::getIndirectSourceEntity, center, radius, fire, list, affectedEntities, blockInteraction);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5,6 +5,7 @@ import net.minecraft.core.BlockPos;
|
|||||||
import net.minecraft.server.commands.FillCommand;
|
import net.minecraft.server.commands.FillCommand;
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.world.level.block.Block;
|
import net.minecraft.world.level.block.Block;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
@@ -14,10 +15,10 @@ public abstract class FillCommandMixin
|
|||||||
{
|
{
|
||||||
@Redirect(method = "fillBlocks", at = @At(
|
@Redirect(method = "fillBlocks", at = @At(
|
||||||
value = "INVOKE",
|
value = "INVOKE",
|
||||||
target = "Lnet/minecraft/server/level/ServerLevel;blockUpdated(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/Block;)V"
|
target = "Lnet/minecraft/server/level/ServerLevel;updateNeighboursOnBlockSet(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)V"
|
||||||
))
|
))
|
||||||
private static void conditionalUpdating(ServerLevel serverWorld, BlockPos blockPos_1, Block block_1)
|
private static void conditionalUpdating(ServerLevel serverWorld, BlockPos blockPos_1, BlockState block_1)
|
||||||
{
|
{
|
||||||
if (CarpetSettings.fillUpdates) serverWorld.blockUpdated(blockPos_1, block_1);
|
if (CarpetSettings.fillUpdates) serverWorld.updateNeighboursOnBlockSet(blockPos_1, block_1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -16,14 +16,14 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
|||||||
public class FlowingFluid_liquidDamageDisabledMixin
|
public class FlowingFluid_liquidDamageDisabledMixin
|
||||||
{
|
{
|
||||||
@Inject(
|
@Inject(
|
||||||
method = "canHoldFluid",
|
method = "canHoldAnyFluid",
|
||||||
at = @At(
|
at = @At(
|
||||||
value = "INVOKE",
|
value = "INVOKE",
|
||||||
target = "Lnet/minecraft/world/level/block/state/BlockState;blocksMotion()Z"
|
target = "Lnet/minecraft/world/level/block/state/BlockState;blocksMotion()Z"
|
||||||
),
|
),
|
||||||
cancellable = true
|
cancellable = true
|
||||||
)
|
)
|
||||||
private void stopBreakingBlock(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid, CallbackInfoReturnable<Boolean> cir)
|
private static void stopBreakingBlock(final BlockState state, final CallbackInfoReturnable<Boolean> cir)
|
||||||
{
|
{
|
||||||
if (CarpetSettings.liquidDamageDisabled)
|
if (CarpetSettings.liquidDamageDisabled)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package carpet.mixins;
|
||||||
|
|
||||||
|
import carpet.fakes.FoodDataInterface;
|
||||||
|
import net.minecraft.world.food.FoodData;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
||||||
|
@Mixin(FoodData.class)
|
||||||
|
public class FoodData_scarpetMixin implements FoodDataInterface
|
||||||
|
{
|
||||||
|
@Shadow private float exhaustionLevel;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getCMExhaustionLevel()
|
||||||
|
{
|
||||||
|
return exhaustionLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setExhaustion(float aFloat)
|
||||||
|
{
|
||||||
|
exhaustionLevel = aFloat;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,12 +1,10 @@
|
|||||||
package carpet.mixins;
|
package carpet.mixins;
|
||||||
|
|
||||||
import carpet.CarpetSettings;
|
import carpet.CarpetSettings;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
|
import net.minecraft.world.entity.EntitySpawnReason;
|
||||||
import net.minecraft.world.entity.EntityType;
|
import net.minecraft.world.entity.EntityType;
|
||||||
import net.minecraft.world.entity.LightningBolt;
|
import net.minecraft.world.entity.LightningBolt;
|
||||||
import net.minecraft.world.entity.MobSpawnType;
|
|
||||||
import net.minecraft.world.entity.SpawnGroupData;
|
|
||||||
import net.minecraft.world.entity.monster.ElderGuardian;
|
import net.minecraft.world.entity.monster.ElderGuardian;
|
||||||
import net.minecraft.world.entity.monster.Guardian;
|
import net.minecraft.world.entity.monster.Guardian;
|
||||||
import net.minecraft.world.entity.monster.Monster;
|
import net.minecraft.world.entity.monster.Monster;
|
||||||
@@ -27,8 +25,8 @@ public abstract class Guardian_renewableSpongesMixin extends Monster
|
|||||||
if (!this.level().isClientSide && !this.isRemoved() && CarpetSettings.renewableSponges && !((Object)this instanceof ElderGuardian))
|
if (!this.level().isClientSide && !this.isRemoved() && CarpetSettings.renewableSponges && !((Object)this instanceof ElderGuardian))
|
||||||
{
|
{
|
||||||
ElderGuardian elderGuardian = new ElderGuardian(EntityType.ELDER_GUARDIAN ,this.level());
|
ElderGuardian elderGuardian = new ElderGuardian(EntityType.ELDER_GUARDIAN ,this.level());
|
||||||
elderGuardian.moveTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot());
|
elderGuardian.snapTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot());
|
||||||
elderGuardian.finalizeSpawn(serverWorld ,this.level().getCurrentDifficultyAt(elderGuardian.blockPosition()), MobSpawnType.CONVERSION, null);
|
elderGuardian.finalizeSpawn(serverWorld ,this.level().getCurrentDifficultyAt(elderGuardian.blockPosition()), EntitySpawnReason.CONVERSION, null);
|
||||||
elderGuardian.setNoAi(this.isNoAi());
|
elderGuardian.setNoAi(this.isNoAi());
|
||||||
|
|
||||||
if (this.hasCustomName())
|
if (this.hasCustomName())
|
||||||
|
|||||||
@@ -1,24 +1,11 @@
|
|||||||
package carpet.mixins;
|
package carpet.mixins;
|
||||||
|
|
||||||
import carpet.fakes.IngredientInterface;
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
import net.minecraft.world.item.ItemStack;
|
|
||||||
import net.minecraft.world.item.crafting.Ingredient;
|
import net.minecraft.world.item.crafting.Ingredient;
|
||||||
|
|
||||||
@Mixin(Ingredient.class)
|
@Mixin(Ingredient.class)
|
||||||
public class Ingredient_scarpetMixin implements IngredientInterface
|
public class Ingredient_scarpetMixin// implements IngredientInterface
|
||||||
{
|
{
|
||||||
@Shadow @Final private Ingredient.Value[] values;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<Collection<ItemStack>> getRecipeStacks()
|
|
||||||
{
|
|
||||||
return Arrays.stream(values).map(Ingredient.Value::getItems).toList();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
package carpet.mixins;
|
||||||
|
|
||||||
|
import carpet.CarpetSettings;
|
||||||
|
import net.minecraft.core.component.DataComponents;
|
||||||
|
import net.minecraft.tags.ItemTags;
|
||||||
|
import net.minecraft.world.item.Item;
|
||||||
|
import net.minecraft.world.item.ItemStack;
|
||||||
|
import net.minecraft.world.item.component.Tool;
|
||||||
|
import net.minecraft.world.level.block.Blocks;
|
||||||
|
import net.minecraft.world.level.block.SoundType;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
|
@Mixin(Item.class)
|
||||||
|
public class Item_missingToolsMixin
|
||||||
|
{
|
||||||
|
@Inject(method = "getDestroySpeed", at = @At("HEAD"), cancellable = true)
|
||||||
|
public void getDestroySpeed(ItemStack itemStack, BlockState blockState, CallbackInfoReturnable<Float> cir) {
|
||||||
|
if (CarpetSettings.missingTools && blockState.getSoundType() == SoundType.GLASS && itemStack.is(ItemTags.PICKAXES))
|
||||||
|
{
|
||||||
|
Tool tool = itemStack.get(DataComponents.TOOL);
|
||||||
|
if (tool != null) {
|
||||||
|
cir.setReturnValue(tool.getMiningSpeed(Blocks.STONE.defaultBlockState()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,7 +2,9 @@ package carpet.mixins;
|
|||||||
|
|
||||||
import carpet.CarpetSettings;
|
import carpet.CarpetSettings;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
|
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.level.chunk.LevelChunk;
|
import net.minecraft.world.level.chunk.LevelChunk;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
@@ -25,20 +27,25 @@ public class LevelChunk_fillUpdatesMixin
|
|||||||
|
|
||||||
@Redirect(method = "setBlockState", at = @At(
|
@Redirect(method = "setBlockState", at = @At(
|
||||||
value = "INVOKE",
|
value = "INVOKE",
|
||||||
target = "Lnet/minecraft/world/level/block/state/BlockState;onRemove(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Z)V"
|
target = "Lnet/minecraft/world/level/block/entity/BlockEntity;preRemoveSideEffects(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)V"
|
||||||
))
|
))
|
||||||
private void onRemovedBlock(BlockState blockState, Level world, BlockPos pos, BlockState state, boolean moved)
|
private void onPreRemoveSideEffects(BlockEntity blockEntity, BlockPos blockPos_1, BlockState blockState_1)
|
||||||
{
|
{
|
||||||
if (CarpetSettings.impendingFillSkipUpdates.get()) // doing due dilligence from AbstractBlock onStateReplaced
|
if (!CarpetSettings.impendingFillSkipUpdates.get())
|
||||||
{
|
{
|
||||||
if (blockState.hasBlockEntity() && !blockState.is(state.getBlock()))
|
blockEntity.preRemoveSideEffects(blockPos_1, blockState_1);
|
||||||
{
|
|
||||||
world.removeBlockEntity(pos);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
}
|
||||||
|
|
||||||
|
@Redirect(method = "setBlockState", at = @At(
|
||||||
|
value = "INVOKE",
|
||||||
|
target = "Lnet/minecraft/world/level/block/state/BlockState;affectNeighborsAfterRemoval(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;Z)V"
|
||||||
|
))
|
||||||
|
private void onAffectNeighborsAfterRemoval(final BlockState instance, final ServerLevel serverLevel, final BlockPos blockPos, final boolean b)
|
||||||
|
{
|
||||||
|
if (!CarpetSettings.impendingFillSkipUpdates.get())
|
||||||
{
|
{
|
||||||
blockState.onRemove(world, pos, state, moved);
|
instance.affectNeighborsAfterRemoval(serverLevel, blockPos, b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,10 +4,15 @@ import carpet.CarpetSettings;
|
|||||||
import carpet.fakes.WorldChunkInterface;
|
import carpet.fakes.WorldChunkInterface;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.core.Registry;
|
import net.minecraft.core.Registry;
|
||||||
|
import net.minecraft.core.SectionPos;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
|
import net.minecraft.util.profiling.Profiler;
|
||||||
|
import net.minecraft.util.profiling.ProfilerFiller;
|
||||||
import net.minecraft.world.level.ChunkPos;
|
import net.minecraft.world.level.ChunkPos;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.LevelHeightAccessor;
|
import net.minecraft.world.level.LevelHeightAccessor;
|
||||||
import net.minecraft.world.level.biome.Biome;
|
import net.minecraft.world.level.biome.Biome;
|
||||||
|
import net.minecraft.world.level.block.BaseRailBlock;
|
||||||
import net.minecraft.world.level.block.Block;
|
import net.minecraft.world.level.block.Block;
|
||||||
import net.minecraft.world.level.block.EntityBlock;
|
import net.minecraft.world.level.block.EntityBlock;
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||||
@@ -19,6 +24,7 @@ import net.minecraft.world.level.chunk.LevelChunkSection;
|
|||||||
import net.minecraft.world.level.chunk.UpgradeData;
|
import net.minecraft.world.level.chunk.UpgradeData;
|
||||||
import net.minecraft.world.level.levelgen.Heightmap;
|
import net.minecraft.world.level.levelgen.Heightmap;
|
||||||
import net.minecraft.world.level.levelgen.blending.BlendingData;
|
import net.minecraft.world.level.levelgen.blending.BlendingData;
|
||||||
|
import net.minecraft.world.level.lighting.LightEngine;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
@@ -72,91 +78,119 @@ public abstract class LevelChunk_movableBEMixin extends ChunkAccess implements W
|
|||||||
*/
|
*/
|
||||||
/* @Nullable */
|
/* @Nullable */
|
||||||
// todo update me to the new version
|
// todo update me to the new version
|
||||||
|
@Override
|
||||||
public BlockState setBlockStateWithBlockEntity(BlockPos blockPos_1, BlockState newBlockState, BlockEntity newBlockEntity,
|
public BlockState setBlockStateWithBlockEntity(BlockPos blockPos_1, BlockState newBlockState, BlockEntity newBlockEntity,
|
||||||
boolean boolean_1)
|
int flags)
|
||||||
{
|
{
|
||||||
int x = blockPos_1.getX() & 15;
|
|
||||||
int y = blockPos_1.getY();
|
int y = blockPos_1.getY();
|
||||||
int z = blockPos_1.getZ() & 15;
|
|
||||||
LevelChunkSection chunkSection = this.getSection(this.getSectionIndex(y));
|
LevelChunkSection chunkSection = this.getSection(this.getSectionIndex(y));
|
||||||
if (chunkSection.hasOnlyAir())
|
|
||||||
|
boolean hadOnlyAir = chunkSection.hasOnlyAir();
|
||||||
|
|
||||||
|
if (hadOnlyAir && newBlockState.isAir())
|
||||||
{
|
{
|
||||||
if (newBlockState.isAir())
|
return null;
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean boolean_2 = chunkSection.hasOnlyAir();
|
int x = blockPos_1.getX() & 15;
|
||||||
BlockState oldBlockState = chunkSection.setBlockState(x, y & 15, z, newBlockState);
|
int chunkY = blockPos_1.getY() & 15;
|
||||||
|
int z = blockPos_1.getZ() & 15;
|
||||||
|
BlockState oldBlockState = chunkSection.setBlockState(x, chunkY, z, newBlockState);
|
||||||
if (oldBlockState == newBlockState)
|
if (oldBlockState == newBlockState)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
else
|
Block newBlock = newBlockState.getBlock();
|
||||||
|
this.heightmaps.get(Heightmap.Types.MOTION_BLOCKING).update(x, y, z, newBlockState);
|
||||||
|
this.heightmaps.get(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES).update(x, y, z, newBlockState);
|
||||||
|
this.heightmaps.get(Heightmap.Types.OCEAN_FLOOR).update(x, y, z, newBlockState);
|
||||||
|
this.heightmaps.get(Heightmap.Types.WORLD_SURFACE).update(x, y, z, newBlockState);
|
||||||
|
boolean hasOnlyAir = chunkSection.hasOnlyAir();
|
||||||
|
if (hadOnlyAir != hasOnlyAir)
|
||||||
{
|
{
|
||||||
Block newBlock = newBlockState.getBlock();
|
this.level.getChunkSource().getLightEngine().updateSectionStatus(blockPos_1, hasOnlyAir);
|
||||||
Block oldBlock = oldBlockState.getBlock();
|
this.level.getChunkSource().onSectionEmptinessChanged(chunkPos.x, SectionPos.blockToSectionCoord(y), chunkPos.z, hasOnlyAir);
|
||||||
((Heightmap) this.heightmaps.get(Heightmap.Types.MOTION_BLOCKING)).update(x, y, z, newBlockState);
|
}
|
||||||
((Heightmap) this.heightmaps.get(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES)).update(x, y, z, newBlockState);
|
|
||||||
((Heightmap) this.heightmaps.get(Heightmap.Types.OCEAN_FLOOR)).update(x, y, z, newBlockState);
|
if (LightEngine.hasDifferentLightProperties(oldBlockState, newBlockState)) {
|
||||||
((Heightmap) this.heightmaps.get(Heightmap.Types.WORLD_SURFACE)).update(x, y, z, newBlockState);
|
ProfilerFiller profiler = Profiler.get();
|
||||||
boolean boolean_3 = chunkSection.hasOnlyAir();
|
profiler.push("updateSkyLightSources");
|
||||||
if (boolean_2 != boolean_3)
|
skyLightSources.update(this, x, chunkY, z);
|
||||||
{
|
profiler.popPush("queueCheckLight");
|
||||||
this.level.getChunkSource().getLightEngine().updateSectionStatus(blockPos_1, boolean_3);
|
level.getChunkSource().getLightEngine().checkBlock(blockPos_1);
|
||||||
|
profiler.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean blockChanged = !oldBlockState.is(newBlock);
|
||||||
|
boolean boolean_1 = (flags & 64) != 0; // moved by pistons
|
||||||
|
boolean sideEffects = (flags & Block.UPDATE_SKIP_BLOCK_ENTITY_SIDEEFFECTS) == 0;
|
||||||
|
|
||||||
|
if (blockChanged && oldBlockState.hasBlockEntity()) {
|
||||||
|
if (level instanceof ServerLevel serverLevel && !(oldBlockState.getBlock() instanceof MovingPistonBlock)) {
|
||||||
|
if (sideEffects) {
|
||||||
|
BlockEntity blockEntity = level.getBlockEntity(blockPos_1);
|
||||||
|
if (blockEntity != null) {
|
||||||
|
blockEntity.preRemoveSideEffects(blockPos_1, oldBlockState);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
removeBlockEntity(blockPos_1);
|
||||||
if (!this.level.isClientSide)
|
}
|
||||||
|
|
||||||
|
if (blockChanged || newBlock instanceof BaseRailBlock)
|
||||||
|
{
|
||||||
|
if (level instanceof ServerLevel serverLevel && !(oldBlockState.getBlock() instanceof MovingPistonBlock))
|
||||||
{
|
{
|
||||||
if (!(oldBlock instanceof MovingPistonBlock))//this is a movableTE special case, if condition wasn't there it would remove the blockentity that was carried for some reason
|
if ((flags & Block.UPDATE_NEIGHBORS) != 0 || boolean_1)
|
||||||
oldBlockState.onRemove(this.level, blockPos_1, newBlockState, boolean_1);//this kills it
|
{
|
||||||
|
oldBlockState.affectNeighborsAfterRemoval(serverLevel, blockPos_1, boolean_1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (oldBlock != newBlock && oldBlock instanceof EntityBlock)
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (chunkSection.getBlockState(x, chunkY, z).getBlock() != newBlock)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!level.isClientSide && sideEffects) {
|
||||||
|
// this updates stuff, schedule ticks - do we want that since its only be called from MovingPistonBlock really?
|
||||||
|
newBlockState.onPlace(level, blockPos_1, oldBlockState, boolean_1);
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockEntity oldBlockEntity = null;
|
||||||
|
if (oldBlockState.hasBlockEntity())
|
||||||
|
{
|
||||||
|
oldBlockEntity = this.getBlockEntity(blockPos_1, LevelChunk.EntityCreationType.CHECK);
|
||||||
|
if (oldBlockEntity != null && !oldBlockEntity.isValidBlockState(oldBlockState))
|
||||||
{
|
{
|
||||||
this.level.removeBlockEntity(blockPos_1);
|
oldBlockEntity.setBlockState(oldBlockState);
|
||||||
}
|
updateBlockEntityTicker(oldBlockEntity);
|
||||||
|
|
||||||
if (chunkSection.getBlockState(x, y & 15, z).getBlock() != newBlock)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
BlockEntity oldBlockEntity = null;
|
if (newBlockEntity == null)
|
||||||
if (oldBlockState.hasBlockEntity())
|
|
||||||
{
|
{
|
||||||
oldBlockEntity = this.getBlockEntity(blockPos_1, LevelChunk.EntityCreationType.CHECK);
|
newBlockEntity = ((EntityBlock) newBlock).newBlockEntity(blockPos_1, newBlockState);
|
||||||
if (oldBlockEntity != null)
|
if (newBlockEntity != null)
|
||||||
{
|
{
|
||||||
oldBlockEntity.setBlockState(oldBlockState);
|
addAndRegisterBlockEntity(newBlockEntity);
|
||||||
updateBlockEntityTicker(oldBlockEntity);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (newBlockEntity != oldBlockEntity && newBlockEntity != null)
|
||||||
if (oldBlockState.hasBlockEntity())
|
|
||||||
{
|
{
|
||||||
if (newBlockEntity == null)
|
newBlockEntity.clearRemoved();
|
||||||
{
|
this.level.setBlockEntity(newBlockEntity);
|
||||||
newBlockEntity = ((EntityBlock) newBlock).newBlockEntity(blockPos_1, newBlockState);
|
newBlockEntity.setBlockState(newBlockState);
|
||||||
}
|
updateBlockEntityTicker(newBlockEntity);
|
||||||
if (newBlockEntity != oldBlockEntity && newBlockEntity != null)
|
|
||||||
{
|
|
||||||
newBlockEntity.clearRemoved();
|
|
||||||
this.level.setBlockEntity(newBlockEntity);
|
|
||||||
newBlockEntity.setBlockState(newBlockState);
|
|
||||||
updateBlockEntityTicker(newBlockEntity);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.level.isClientSide)
|
|
||||||
{
|
|
||||||
newBlockState.onPlace(this.level, blockPos_1, oldBlockState, boolean_1); //This can call setblockstate! (e.g. hopper does)
|
|
||||||
}
|
|
||||||
|
|
||||||
this.unsaved = true; // shouldSave
|
|
||||||
return oldBlockState;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
markUnsaved();
|
||||||
|
return oldBlockState;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,18 +2,20 @@ package carpet.mixins;
|
|||||||
|
|
||||||
import carpet.network.CarpetClient;
|
import carpet.network.CarpetClient;
|
||||||
import carpet.script.utils.ShapesRenderer;
|
import carpet.script.utils.ShapesRenderer;
|
||||||
import com.mojang.blaze3d.vertex.PoseStack;
|
import com.mojang.blaze3d.buffers.GpuBufferSlice;
|
||||||
|
import com.mojang.blaze3d.framegraph.FrameGraphBuilder;
|
||||||
|
import com.mojang.blaze3d.framegraph.FramePass;
|
||||||
import net.minecraft.client.Camera;
|
import net.minecraft.client.Camera;
|
||||||
import net.minecraft.client.DeltaTracker;
|
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.renderer.GameRenderer;
|
|
||||||
import net.minecraft.client.renderer.LevelRenderer;
|
import net.minecraft.client.renderer.LevelRenderer;
|
||||||
|
import net.minecraft.client.renderer.LevelTargetBundle;
|
||||||
import net.minecraft.client.renderer.LightTexture;
|
import net.minecraft.client.renderer.LightTexture;
|
||||||
import net.minecraft.client.renderer.RenderBuffers;
|
import net.minecraft.client.renderer.RenderBuffers;
|
||||||
import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher;
|
import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher;
|
||||||
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
|
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
|
||||||
import org.joml.Matrix4f;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
@@ -21,30 +23,25 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|||||||
@Mixin(LevelRenderer.class)
|
@Mixin(LevelRenderer.class)
|
||||||
public class LevelRenderer_scarpetRenderMixin
|
public class LevelRenderer_scarpetRenderMixin
|
||||||
{
|
{
|
||||||
|
@Shadow @Final private LevelTargetBundle targets;
|
||||||
|
|
||||||
@Inject(method = "<init>", at = @At("RETURN"))
|
@Inject(method = "<init>", at = @At("RETURN"))
|
||||||
private void addRenderers(Minecraft minecraft, EntityRenderDispatcher entityRenderDispatcher, BlockEntityRenderDispatcher blockEntityRenderDispatcher, RenderBuffers renderBuffers, CallbackInfo ci)
|
private void addRenderers(Minecraft minecraft, EntityRenderDispatcher entityRenderDispatcher, BlockEntityRenderDispatcher blockEntityRenderDispatcher, RenderBuffers renderBuffers, CallbackInfo ci)
|
||||||
{
|
{
|
||||||
CarpetClient.shapes = new ShapesRenderer(minecraft);
|
CarpetClient.shapes = new ShapesRenderer(minecraft);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "renderLevel", at = @At(
|
@Inject(method = "addParticlesPass", at = @At("RETURN"))
|
||||||
value = "INVOKE",
|
private void renderScarpetThingsLate(FrameGraphBuilder frameGraphBuilder, Camera camera, float f, GpuBufferSlice fogParameters, CallbackInfo ci)
|
||||||
target = "Lnet/minecraft/client/renderer/Sheets;translucentCullBlockSheet()Lnet/minecraft/client/renderer/RenderType;", shift = At.Shift.BEFORE
|
|
||||||
//target = "Lnet/minecraft/client/render/RenderLayer;getWaterMask()Lnet/minecraft/client/render/RenderLayer;", shift = At.Shift.AFTER
|
|
||||||
//target = "Lnet/minecraft/client/render/BufferBuilderStorage;getEffectVertexConsumers()Lnet/minecraft/client/render/VertexConsumerProvider$Immediate;", shift = At.Shift.BEFORE
|
|
||||||
//target = "Lnet/minecraft/client/render/WorldRenderer;renderChunkDebugInfo(Lnet/minecraft/client/render/Camera;)V", shift = At.Shift.AFTER
|
|
||||||
//target = "Lnet/minecraft/client/render/BackgroundRenderer;method_23792()V", shift = At.Shift.AFTER
|
|
||||||
//target = "Lnet/minecraft/client/render/BufferBuilderStorage;getEntityVertexConsumers()Lnet/minecraft/client/render/VertexConsumerProvider$Immediate;", shift = At.Shift.AFTER
|
|
||||||
//target = "Lnet/minecraft/client/render/WorldRenderer;renderChunkDebugInfo(Lnet/minecraft/client/render/Camera;)V", shift = At.Shift.AFTER // before return
|
|
||||||
))
|
|
||||||
private void renderScarpetThings(final DeltaTracker deltaTracker, final boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightmapTextureManager, Matrix4f modelViewMatrix, Matrix4f matrix4f, CallbackInfo ci)
|
|
||||||
{
|
{
|
||||||
// in normal circumstances we want to render shapes at the very end so it appears correctly behind stuff.
|
// in normal circumstances we want to render shapes at the very end so it appears correctly behind stuff.
|
||||||
// we might actually not need to play with render hooks here.
|
// we might actually not need to play with render hooks here.
|
||||||
//if (!FabricAPIHooks.WORLD_RENDER_EVENTS && CarpetClient.shapes != null )
|
//if (!FabricAPIHooks.WORLD_RENDER_EVENTS && CarpetClient.shapes != null )
|
||||||
if (CarpetClient.shapes != null)
|
if (CarpetClient.shapes != null)
|
||||||
{
|
{
|
||||||
CarpetClient.shapes.render(modelViewMatrix, camera, deltaTracker.getGameTimeDeltaPartialTick(false));
|
FramePass pass = frameGraphBuilder.addPass("scarpet_shapes");
|
||||||
|
targets.main = pass.readsAndWrites(targets.main);
|
||||||
|
pass.executes(() -> CarpetClient.shapes.render(null, camera, f));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -23,11 +23,11 @@ public abstract class Level_fillUpdatesMixin
|
|||||||
|
|
||||||
@Redirect(method = "setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;II)Z", at = @At( //setBlockState main
|
@Redirect(method = "setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;II)Z", at = @At( //setBlockState main
|
||||||
value = "INVOKE",
|
value = "INVOKE",
|
||||||
target = "Lnet/minecraft/world/level/Level;blockUpdated(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/Block;)V"
|
target = "Lnet/minecraft/world/level/Level;updateNeighborsAt(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/Block;)V"
|
||||||
))
|
))
|
||||||
private void updateNeighborsMaybe(Level world, BlockPos blockPos, Block block)
|
private void updateNeighborsMaybe(Level world, BlockPos blockPos, Block block)
|
||||||
{
|
{
|
||||||
if (!CarpetSettings.impendingFillSkipUpdates.get()) world.blockUpdated(blockPos, block);
|
if (!CarpetSettings.impendingFillSkipUpdates.get()) world.updateNeighborsAt(blockPos, block);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -2,6 +2,7 @@ package carpet.mixins;
|
|||||||
|
|
||||||
import carpet.fakes.LevelInterface;
|
import carpet.fakes.LevelInterface;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
import net.minecraft.util.profiling.Profiler;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
@@ -9,7 +10,6 @@ import org.spongepowered.asm.mixin.Shadow;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import net.minecraft.util.profiling.ProfilerFiller;
|
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import net.minecraft.world.entity.boss.EnderDragonPart;
|
import net.minecraft.world.entity.boss.EnderDragonPart;
|
||||||
import net.minecraft.world.entity.boss.enderdragon.EnderDragon;
|
import net.minecraft.world.entity.boss.enderdragon.EnderDragon;
|
||||||
@@ -24,7 +24,7 @@ public abstract class Level_getOtherEntitiesLimited implements LevelInterface {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Entity> getOtherEntitiesLimited(@Nullable Entity except, AABB box, Predicate<? super Entity> predicate, int limit) {
|
public List<Entity> getOtherEntitiesLimited(@Nullable Entity except, AABB box, Predicate<? super Entity> predicate, int limit) {
|
||||||
this.getProfiler().incrementCounter("getEntities"); // visit
|
Profiler.get().incrementCounter("getEntities"); // visit
|
||||||
AtomicInteger checkedEntities = new AtomicInteger();
|
AtomicInteger checkedEntities = new AtomicInteger();
|
||||||
List<Entity> list = Lists.newArrayList();
|
List<Entity> list = Lists.newArrayList();
|
||||||
try {
|
try {
|
||||||
@@ -55,9 +55,6 @@ public abstract class Level_getOtherEntitiesLimited implements LevelInterface {
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Shadow
|
|
||||||
public abstract ProfilerFiller getProfiler();
|
|
||||||
|
|
||||||
@Shadow
|
@Shadow
|
||||||
protected abstract LevelEntityGetter<Entity> getEntities();
|
protected abstract LevelEntityGetter<Entity> getEntities();
|
||||||
}
|
}
|
||||||
@@ -4,8 +4,8 @@ import carpet.fakes.WorldChunkInterface;
|
|||||||
import carpet.fakes.LevelInterface;
|
import carpet.fakes.LevelInterface;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.server.level.FullChunkStatus;
|
import net.minecraft.server.level.FullChunkStatus;
|
||||||
|
import net.minecraft.util.profiling.Profiler;
|
||||||
import net.minecraft.util.profiling.ProfilerFiller;
|
import net.minecraft.util.profiling.ProfilerFiller;
|
||||||
import net.minecraft.world.level.BlockGetter;
|
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.LevelAccessor;
|
import net.minecraft.world.level.LevelAccessor;
|
||||||
import net.minecraft.world.level.block.Block;
|
import net.minecraft.world.level.block.Block;
|
||||||
@@ -28,32 +28,18 @@ public abstract class Level_movableBEMixin implements LevelInterface, LevelAcces
|
|||||||
@Shadow
|
@Shadow
|
||||||
public abstract LevelChunk getChunkAt(BlockPos blockPos_1);
|
public abstract LevelChunk getChunkAt(BlockPos blockPos_1);
|
||||||
|
|
||||||
@Shadow
|
|
||||||
public abstract BlockState getBlockState(BlockPos blockPos_1);
|
|
||||||
|
|
||||||
//@Shadow
|
|
||||||
//public abstract ChunkManager getChunkManager();
|
|
||||||
|
|
||||||
@Shadow
|
@Shadow
|
||||||
public abstract void setBlocksDirty(BlockPos blockPos_1, BlockState s1, BlockState s2);
|
public abstract void setBlocksDirty(BlockPos blockPos_1, BlockState s1, BlockState s2);
|
||||||
|
|
||||||
@Shadow
|
@Shadow
|
||||||
public abstract void sendBlockUpdated(BlockPos var1, BlockState var2, BlockState var3, int var4);
|
public abstract void sendBlockUpdated(BlockPos var1, BlockState var2, BlockState var3, int var4);
|
||||||
|
|
||||||
@Shadow
|
|
||||||
public abstract void updateNeighborsAt(BlockPos blockPos_1, Block block_1);
|
|
||||||
|
|
||||||
@Shadow
|
|
||||||
public abstract void onBlockStateChange(BlockPos blockPos_1, BlockState blockState_1, BlockState blockState_2);
|
|
||||||
|
|
||||||
@Shadow public abstract ProfilerFiller getProfiler();
|
|
||||||
|
|
||||||
@Shadow public abstract void updateNeighbourForOutputSignal(BlockPos pos, Block block);
|
@Shadow public abstract void updateNeighbourForOutputSignal(BlockPos pos, Block block);
|
||||||
|
|
||||||
//@Shadow public abstract boolean setBlockState(BlockPos pos, BlockState state, int flags);
|
|
||||||
|
|
||||||
@Shadow public abstract boolean isDebug();
|
@Shadow public abstract boolean isDebug();
|
||||||
|
|
||||||
|
@Shadow public abstract void updatePOIOnBlockStateChange(final BlockPos blockPos, final BlockState blockState, final BlockState blockState2);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author 2No2Name
|
* @author 2No2Name
|
||||||
*/
|
*/
|
||||||
@@ -67,7 +53,7 @@ public abstract class Level_movableBEMixin implements LevelInterface, LevelAcces
|
|||||||
BlockState blockState_2;
|
BlockState blockState_2;
|
||||||
if (newBlockEntity != null && block_1 instanceof EntityBlock)
|
if (newBlockEntity != null && block_1 instanceof EntityBlock)
|
||||||
{
|
{
|
||||||
blockState_2 = ((WorldChunkInterface) worldChunk_1).setBlockStateWithBlockEntity(blockPos_1, blockState_1, newBlockEntity, (int_1 & 64) != 0);
|
blockState_2 = ((WorldChunkInterface) worldChunk_1).setBlockStateWithBlockEntity(blockPos_1, blockState_1, newBlockEntity, int_1);
|
||||||
if (newBlockEntity instanceof LidBlockEntity)
|
if (newBlockEntity instanceof LidBlockEntity)
|
||||||
{
|
{
|
||||||
scheduleTick(blockPos_1, block_1, 5);
|
scheduleTick(blockPos_1, block_1, 5);
|
||||||
@@ -75,56 +61,46 @@ public abstract class Level_movableBEMixin implements LevelInterface, LevelAcces
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
blockState_2 = worldChunk_1.setBlockState(blockPos_1, blockState_1, (int_1 & 64) != 0);
|
blockState_2 = worldChunk_1.setBlockState(blockPos_1, blockState_1, int_1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (blockState_2 == null)
|
if (blockState_2 == null)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
BlockState blockState_3 = this.getBlockState(blockPos_1);
|
||||||
|
|
||||||
|
if (blockState_3 == blockState_1)
|
||||||
{
|
{
|
||||||
BlockState blockState_3 = this.getBlockState(blockPos_1);
|
if (blockState_2 != blockState_3)
|
||||||
|
|
||||||
if (blockState_3 != blockState_2 && (blockState_3.getLightBlock((BlockGetter) this, blockPos_1) != blockState_2.getLightBlock((BlockGetter) this, blockPos_1) || blockState_3.getLightEmission() != blockState_2.getLightEmission() || blockState_3.useShapeForLightOcclusion() || blockState_2.useShapeForLightOcclusion()))
|
|
||||||
{
|
{
|
||||||
ProfilerFiller profiler = getProfiler();
|
this.setBlocksDirty(blockPos_1, blockState_2, blockState_3);
|
||||||
profiler.push("queueCheckLight");
|
|
||||||
this.getChunkSource().getLightEngine().checkBlock(blockPos_1);
|
|
||||||
profiler.pop();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (blockState_3 == blockState_1)
|
if ((int_1 & 2) != 0 && (!this.isClientSide || (int_1 & 4) == 0) && (this.isClientSide || worldChunk_1.getFullStatus() != null && worldChunk_1.getFullStatus().isOrAfter(FullChunkStatus.BLOCK_TICKING)))
|
||||||
{
|
{
|
||||||
if (blockState_2 != blockState_3)
|
this.sendBlockUpdated(blockPos_1, blockState_2, blockState_1, int_1);
|
||||||
{
|
|
||||||
this.setBlocksDirty(blockPos_1, blockState_2, blockState_3);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((int_1 & 2) != 0 && (!this.isClientSide || (int_1 & 4) == 0) && (this.isClientSide || worldChunk_1.getFullStatus() != null && worldChunk_1.getFullStatus().isOrAfter(FullChunkStatus.BLOCK_TICKING)))
|
|
||||||
{
|
|
||||||
this.sendBlockUpdated(blockPos_1, blockState_2, blockState_1, int_1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!this.isClientSide && (int_1 & 1) != 0)
|
|
||||||
{
|
|
||||||
this.updateNeighborsAt(blockPos_1, blockState_2.getBlock());
|
|
||||||
if (blockState_1.hasAnalogOutputSignal())
|
|
||||||
{
|
|
||||||
updateNeighbourForOutputSignal(blockPos_1, block_1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((int_1 & 16) == 0)
|
|
||||||
{
|
|
||||||
int int_2 = int_1 & -34;
|
|
||||||
blockState_2.updateIndirectNeighbourShapes(this, blockPos_1, int_2); // prepare
|
|
||||||
blockState_1.updateNeighbourShapes(this, blockPos_1, int_2); // updateNeighbours
|
|
||||||
blockState_1.updateIndirectNeighbourShapes(this, blockPos_1, int_2); // prepare
|
|
||||||
}
|
|
||||||
this.onBlockStateChange(blockPos_1, blockState_2, blockState_3);
|
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
if (!this.isClientSide && (int_1 & 1) != 0)
|
||||||
|
{
|
||||||
|
this.updateNeighborsAt(blockPos_1, blockState_2.getBlock());
|
||||||
|
if (blockState_1.hasAnalogOutputSignal())
|
||||||
|
{
|
||||||
|
updateNeighbourForOutputSignal(blockPos_1, block_1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((int_1 & 16) == 0)
|
||||||
|
{
|
||||||
|
int int_2 = int_1 & -34;
|
||||||
|
blockState_2.updateIndirectNeighbourShapes(this, blockPos_1, int_2); // prepare
|
||||||
|
blockState_1.updateNeighbourShapes(this, blockPos_1, int_2); // updateNeighbours
|
||||||
|
blockState_1.updateIndirectNeighbourShapes(this, blockPos_1, int_2); // prepare
|
||||||
|
}
|
||||||
|
updatePOIOnBlockStateChange(blockPos_1, blockState_2, blockState_3);
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package carpet.mixins;
|
package carpet.mixins;
|
||||||
|
|
||||||
import carpet.CarpetSettings;
|
import carpet.CarpetSettings;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import net.minecraft.world.entity.EntityType;
|
import net.minecraft.world.entity.EntityType;
|
||||||
import net.minecraft.world.entity.LivingEntity;
|
import net.minecraft.world.entity.LivingEntity;
|
||||||
@@ -22,6 +23,6 @@ public abstract class LivingEntity_cleanLogsMixin extends Entity
|
|||||||
@Redirect(method = "die", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;hasCustomName()Z"))
|
@Redirect(method = "die", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;hasCustomName()Z"))
|
||||||
private boolean shouldLogDeaths(LivingEntity livingEntity)
|
private boolean shouldLogDeaths(LivingEntity livingEntity)
|
||||||
{
|
{
|
||||||
return livingEntity.hasCustomName() && CarpetSettings.cleanLogs && level().getGameRules().getBoolean(GameRules.RULE_SHOWDEATHMESSAGES);
|
return livingEntity.hasCustomName() && CarpetSettings.cleanLogs && livingEntity.getServer().getGameRules().getBoolean(GameRules.RULE_SHOWDEATHMESSAGES);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -25,8 +25,8 @@ public abstract class LivingEntity_creativeFlyMixin extends Entity
|
|||||||
super(type, world);
|
super(type, world);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ModifyConstant(method = "travel", constant = @Constant(floatValue = 0.91F), expect = 2)
|
@ModifyConstant(method = "travelInAir", constant = @Constant(floatValue = 0.91F), expect = 1)
|
||||||
private float drag(float original)
|
private float dragAir(float original)
|
||||||
{
|
{
|
||||||
if (CarpetSettings.creativeFlyDrag != 0.09 && (Object)this instanceof Player)
|
if (CarpetSettings.creativeFlyDrag != 0.09 && (Object)this instanceof Player)
|
||||||
{
|
{
|
||||||
@@ -37,7 +37,6 @@ public abstract class LivingEntity_creativeFlyMixin extends Entity
|
|||||||
return original;
|
return original;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Inject(method = "getFrictionInfluencedSpeed(F)F", at = @At("HEAD"), cancellable = true)
|
@Inject(method = "getFrictionInfluencedSpeed(F)F", at = @At("HEAD"), cancellable = true)
|
||||||
private void flyingAltSpeed(float slipperiness, CallbackInfoReturnable<Float> cir)
|
private void flyingAltSpeed(float slipperiness, CallbackInfoReturnable<Float> cir)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package carpet.mixins;
|
|||||||
|
|
||||||
import carpet.CarpetSettings;
|
import carpet.CarpetSettings;
|
||||||
import carpet.fakes.LevelInterface;
|
import carpet.fakes.LevelInterface;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
@@ -33,12 +34,18 @@ public abstract class LivingEntity_maxCollisionsMixin extends Entity
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!(this.level() instanceof ServerLevel serverLevel))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
List<Entity> entities;
|
List<Entity> entities;
|
||||||
int maxEntityCramming =-1;
|
int maxEntityCramming =-1;
|
||||||
if (CarpetSettings.maxEntityCollisions > 0)
|
if (CarpetSettings.maxEntityCollisions > 0)
|
||||||
{
|
{
|
||||||
maxEntityCramming = this.level().getGameRules().getInt(GameRules.RULE_MAX_ENTITY_CRAMMING);
|
maxEntityCramming = serverLevel.getGameRules().getInt(GameRules.RULE_MAX_ENTITY_CRAMMING);
|
||||||
entities = ((LevelInterface) this.level()).getOtherEntitiesLimited(
|
entities = ((LevelInterface) serverLevel).getOtherEntitiesLimited(
|
||||||
this,
|
this,
|
||||||
this.getBoundingBox(),
|
this.getBoundingBox(),
|
||||||
EntitySelector.pushableBy(this),
|
EntitySelector.pushableBy(this),
|
||||||
@@ -46,11 +53,11 @@ public abstract class LivingEntity_maxCollisionsMixin extends Entity
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
entities = this.level().getEntities(this, this.getBoundingBox(), EntitySelector.pushableBy(this));
|
entities = serverLevel.getEntities(this, this.getBoundingBox(), EntitySelector.pushableBy(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!entities.isEmpty()) {
|
if (!entities.isEmpty()) {
|
||||||
if (maxEntityCramming < 0) maxEntityCramming = this.level().getGameRules().getInt(GameRules.RULE_MAX_ENTITY_CRAMMING);
|
if (maxEntityCramming < 0) maxEntityCramming = serverLevel.getGameRules().getInt(GameRules.RULE_MAX_ENTITY_CRAMMING);
|
||||||
if (maxEntityCramming > 0 && entities.size() > maxEntityCramming - 1 && this.random.nextInt(4) == 0) {
|
if (maxEntityCramming > 0 && entities.size() > maxEntityCramming - 1 && this.random.nextInt(4) == 0) {
|
||||||
int candidates = 0;
|
int candidates = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package carpet.mixins;
|
|||||||
import carpet.fakes.EntityInterface;
|
import carpet.fakes.EntityInterface;
|
||||||
import carpet.fakes.LivingEntityInterface;
|
import carpet.fakes.LivingEntityInterface;
|
||||||
import carpet.script.EntityEventsGroup;
|
import carpet.script.EntityEventsGroup;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
import net.minecraft.world.damagesource.DamageSource;
|
import net.minecraft.world.damagesource.DamageSource;
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
@@ -42,7 +43,7 @@ public abstract class LivingEntity_scarpetEventsMixin extends Entity implements
|
|||||||
target = "Lnet/minecraft/world/entity/LivingEntity;getDamageAfterArmorAbsorb(Lnet/minecraft/world/damagesource/DamageSource;F)F",
|
target = "Lnet/minecraft/world/entity/LivingEntity;getDamageAfterArmorAbsorb(Lnet/minecraft/world/damagesource/DamageSource;F)F",
|
||||||
shift = At.Shift.BEFORE
|
shift = At.Shift.BEFORE
|
||||||
))
|
))
|
||||||
private void entityTakingDamage(DamageSource source, float amount, CallbackInfo ci)
|
private void entityTakingDamage(ServerLevel serverLevel, DamageSource source, float amount, CallbackInfo ci)
|
||||||
{
|
{
|
||||||
((EntityInterface)this).getEventContainer().onEvent(EntityEventsGroup.Event.ON_DAMAGE, amount, source);
|
((EntityInterface)this).getEventContainer().onEvent(EntityEventsGroup.Event.ON_DAMAGE, amount, source);
|
||||||
// this is not applicable since its not a playr for sure
|
// this is not applicable since its not a playr for sure
|
||||||
|
|||||||
@@ -15,8 +15,8 @@ public class MinecraftMixin
|
|||||||
{
|
{
|
||||||
@Shadow public ClientLevel level;
|
@Shadow public ClientLevel level;
|
||||||
|
|
||||||
@Inject(method = "disconnect(Lnet/minecraft/client/gui/screens/Screen;)V", at = @At("HEAD"))
|
@Inject(method = "disconnect(Lnet/minecraft/client/gui/screens/Screen;Z)V", at = @At("HEAD"))
|
||||||
private void onCloseGame(Screen screen, CallbackInfo ci)
|
private void onCloseGame(Screen screen, boolean b, CallbackInfo ci)
|
||||||
{
|
{
|
||||||
CarpetClient.disconnect();
|
CarpetClient.disconnect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import net.minecraft.server.MinecraftServer;
|
|||||||
public abstract class MinecraftServer_pingPlayerSampleLimit
|
public abstract class MinecraftServer_pingPlayerSampleLimit
|
||||||
{
|
{
|
||||||
|
|
||||||
@ModifyConstant(method = "tickServer", constant = @Constant(intValue = 12), require = 0, allow = 1)
|
@ModifyConstant(method = "buildPlayerStatus", constant = @Constant(intValue = 12), require = 1)
|
||||||
private int modifyPlayerSampleLimit(int value)
|
private int modifyPlayerSampleLimit(int value)
|
||||||
{
|
{
|
||||||
return CarpetSettings.pingPlayerListLimit;
|
return CarpetSettings.pingPlayerListLimit;
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ public abstract class MinecraftServer_scarpetMixin extends ReentrantBlockableEve
|
|||||||
@Override
|
@Override
|
||||||
public void reloadAfterReload(RegistryAccess newRegs)
|
public void reloadAfterReload(RegistryAccess newRegs)
|
||||||
{
|
{
|
||||||
resources.managers().updateRegistryTags();
|
resources.managers().updateStaticRegistryTags();
|
||||||
getPlayerList().saveAll();
|
getPlayerList().saveAll();
|
||||||
getPlayerList().reloadResources();
|
getPlayerList().reloadResources();
|
||||||
functionManager.replaceLibrary(this.resources.managers().getFunctionLibrary());
|
functionManager.replaceLibrary(this.resources.managers().getFunctionLibrary());
|
||||||
|
|||||||
@@ -10,8 +10,6 @@ import org.spongepowered.asm.mixin.injection.At;
|
|||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
import java.util.function.BooleanSupplier;
|
|
||||||
|
|
||||||
@Mixin(value = MinecraftServer.class, priority = Integer.MAX_VALUE - 10)
|
@Mixin(value = MinecraftServer.class, priority = Integer.MAX_VALUE - 10)
|
||||||
public abstract class MinecraftServer_tickspeedMixin extends ReentrantBlockableEventLoop<TickTask> implements MinecraftServerInterface
|
public abstract class MinecraftServer_tickspeedMixin extends ReentrantBlockableEventLoop<TickTask> implements MinecraftServerInterface
|
||||||
{
|
{
|
||||||
@@ -26,7 +24,7 @@ public abstract class MinecraftServer_tickspeedMixin extends ReentrantBlockableE
|
|||||||
// could possibly just inject that mspt selection at the beginning of the loop, but then adding all mspt's to
|
// could possibly just inject that mspt selection at the beginning of the loop, but then adding all mspt's to
|
||||||
// replace 50L will be a hassle
|
// replace 50L will be a hassle
|
||||||
@Inject(method = "runServer", at = @At(value = "INVOKE", shift = At.Shift.AFTER,
|
@Inject(method = "runServer", at = @At(value = "INVOKE", shift = At.Shift.AFTER,
|
||||||
target = "Lnet/minecraft/server/MinecraftServer;startMetricsRecordingTick()V"))
|
target = "Lnet/minecraft/util/profiling/Profiler;get()Lnet/minecraft/util/profiling/ProfilerFiller;"))
|
||||||
private void modifiedRunLoop(CallbackInfo ci)
|
private void modifiedRunLoop(CallbackInfo ci)
|
||||||
{
|
{
|
||||||
if (CarpetProfiler.tick_health_requested != 0L)
|
if (CarpetProfiler.tick_health_requested != 0L)
|
||||||
@@ -36,42 +34,34 @@ public abstract class MinecraftServer_tickspeedMixin extends ReentrantBlockableE
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Inject(method = "tickServer", at = @At(
|
@Inject(method = "autoSave", at = @At(
|
||||||
value = "INVOKE",
|
value = "INVOKE",
|
||||||
target = "Lnet/minecraft/server/MinecraftServer;saveEverything(ZZZ)Z", // save
|
target = "Lnet/minecraft/server/MinecraftServer;saveEverything(ZZZ)Z", // save
|
||||||
shift = At.Shift.BEFORE
|
shift = At.Shift.BEFORE
|
||||||
))
|
))
|
||||||
private void startAutosave(BooleanSupplier booleanSupplier_1, CallbackInfo ci)
|
private void startAutosave(final CallbackInfo ci)
|
||||||
{
|
{
|
||||||
currentSection = CarpetProfiler.start_section(null, "Autosave", CarpetProfiler.TYPE.GENERAL);
|
currentSection = CarpetProfiler.start_section(null, "Autosave", CarpetProfiler.TYPE.GENERAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "tickServer", at = @At(
|
@Inject(method = "autoSave", at = @At(
|
||||||
value = "INVOKE",
|
value = "INVOKE",
|
||||||
target = "Lnet/minecraft/server/MinecraftServer;saveEverything(ZZZ)Z",
|
target = "Lnet/minecraft/server/MinecraftServer;saveEverything(ZZZ)Z",
|
||||||
shift = At.Shift.AFTER
|
shift = At.Shift.AFTER
|
||||||
))
|
))
|
||||||
private void finishAutosave(BooleanSupplier booleanSupplier_1, CallbackInfo ci)
|
private void finishAutosave(final CallbackInfo ci)
|
||||||
{
|
{
|
||||||
CarpetProfiler.end_current_section(currentSection);
|
CarpetProfiler.end_current_section(currentSection);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "tickChildren", at = @At(
|
@Inject(method = "tickConnection", at = @At("HEAD"))
|
||||||
value = "INVOKE",
|
private void startNetwork(final CallbackInfo ci)
|
||||||
target = "Lnet/minecraft/server/MinecraftServer;getConnection()Lnet/minecraft/server/network/ServerConnectionListener;",
|
|
||||||
shift = At.Shift.BEFORE
|
|
||||||
))
|
|
||||||
private void startNetwork(BooleanSupplier booleanSupplier_1, CallbackInfo ci)
|
|
||||||
{
|
{
|
||||||
currentSection = CarpetProfiler.start_section(null, "Network", CarpetProfiler.TYPE.GENERAL);
|
currentSection = CarpetProfiler.start_section(null, "Network", CarpetProfiler.TYPE.GENERAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "tickChildren", at = @At(
|
@Inject(method = "tickConnection", at = @At("RETURN"))
|
||||||
value = "INVOKE",
|
private void finishNetwork(final CallbackInfo ci)
|
||||||
target = "Lnet/minecraft/server/players/PlayerList;tick()V",
|
|
||||||
shift = At.Shift.AFTER
|
|
||||||
))
|
|
||||||
private void finishNetwork(BooleanSupplier booleanSupplier_1, CallbackInfo ci)
|
|
||||||
{
|
{
|
||||||
CarpetProfiler.end_current_section(currentSection);
|
CarpetProfiler.end_current_section(currentSection);
|
||||||
}
|
}
|
||||||
@@ -94,6 +84,4 @@ public abstract class MinecraftServer_tickspeedMixin extends ReentrantBlockableE
|
|||||||
CarpetProfiler.end_tick_profiling((MinecraftServer) (Object)this);
|
CarpetProfiler.end_tick_profiling((MinecraftServer) (Object)this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -3,6 +3,7 @@ package carpet.mixins;
|
|||||||
import carpet.CarpetSettings;
|
import carpet.CarpetSettings;
|
||||||
import carpet.fakes.LevelInterface;
|
import carpet.fakes.LevelInterface;
|
||||||
import carpet.utils.SpawnReporter;
|
import carpet.utils.SpawnReporter;
|
||||||
|
import net.minecraft.world.entity.EntitySpawnReason;
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
@@ -12,9 +13,9 @@ import org.spongepowered.asm.mixin.injection.Inject;
|
|||||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
|
||||||
import net.minecraft.resources.ResourceKey;
|
import net.minecraft.resources.ResourceKey;
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.tags.BlockTags;
|
import net.minecraft.tags.BlockTags;
|
||||||
@@ -24,7 +25,6 @@ import net.minecraft.world.entity.Entity;
|
|||||||
import net.minecraft.world.entity.EntityType;
|
import net.minecraft.world.entity.EntityType;
|
||||||
import net.minecraft.world.entity.Mob;
|
import net.minecraft.world.entity.Mob;
|
||||||
import net.minecraft.world.entity.MobCategory;
|
import net.minecraft.world.entity.MobCategory;
|
||||||
import net.minecraft.world.entity.MobSpawnType;
|
|
||||||
import net.minecraft.world.entity.SpawnGroupData;
|
import net.minecraft.world.entity.SpawnGroupData;
|
||||||
import net.minecraft.world.entity.player.Player;
|
import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
@@ -133,9 +133,9 @@ public class NaturalSpawnerMixin
|
|||||||
|
|
||||||
@Redirect(method = "getMobForSpawn", at = @At(
|
@Redirect(method = "getMobForSpawn", at = @At(
|
||||||
value = "INVOKE",
|
value = "INVOKE",
|
||||||
target = "Lnet/minecraft/world/entity/EntityType;create(Lnet/minecraft/world/level/Level;)Lnet/minecraft/world/entity/Entity;"
|
target = "Lnet/minecraft/world/entity/EntityType;create(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/EntitySpawnReason;)Lnet/minecraft/world/entity/Entity;"
|
||||||
))
|
))
|
||||||
private static Entity create(EntityType<?> entityType, Level world_1)
|
private static Entity create(final EntityType entityType, final Level world_1, final EntitySpawnReason entitySpawnReason)
|
||||||
{
|
{
|
||||||
if (CarpetSettings.lagFreeSpawning)
|
if (CarpetSettings.lagFreeSpawning)
|
||||||
{
|
{
|
||||||
@@ -143,11 +143,11 @@ public class NaturalSpawnerMixin
|
|||||||
if (precookedMobs.containsKey(entityType))
|
if (precookedMobs.containsKey(entityType))
|
||||||
//this mob has been <init>'s but not used yet
|
//this mob has been <init>'s but not used yet
|
||||||
return precookedMobs.get(entityType);
|
return precookedMobs.get(entityType);
|
||||||
Entity e = entityType.create(world_1);
|
Entity e = entityType.create(world_1, entitySpawnReason);
|
||||||
precookedMobs.put(entityType, e);
|
precookedMobs.put(entityType, e);
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
return entityType.create(world_1);
|
return entityType.create(world_1, entitySpawnReason);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Redirect(method = "spawnCategoryForPosition(Lnet/minecraft/world/entity/MobCategory;Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/level/chunk/ChunkAccess;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/NaturalSpawner$SpawnPredicate;Lnet/minecraft/world/level/NaturalSpawner$AfterSpawnCallback;)V", at = @At(
|
@Redirect(method = "spawnCategoryForPosition(Lnet/minecraft/world/entity/MobCategory;Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/level/chunk/ChunkAccess;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/NaturalSpawner$SpawnPredicate;Lnet/minecraft/world/level/NaturalSpawner$AfterSpawnCallback;)V", at = @At(
|
||||||
@@ -176,9 +176,9 @@ public class NaturalSpawnerMixin
|
|||||||
|
|
||||||
@Redirect(method = "spawnCategoryForPosition(Lnet/minecraft/world/entity/MobCategory;Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/level/chunk/ChunkAccess;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/NaturalSpawner$SpawnPredicate;Lnet/minecraft/world/level/NaturalSpawner$AfterSpawnCallback;)V", at = @At(
|
@Redirect(method = "spawnCategoryForPosition(Lnet/minecraft/world/entity/MobCategory;Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/level/chunk/ChunkAccess;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/NaturalSpawner$SpawnPredicate;Lnet/minecraft/world/level/NaturalSpawner$AfterSpawnCallback;)V", at = @At(
|
||||||
value = "INVOKE",
|
value = "INVOKE",
|
||||||
target = "Lnet/minecraft/world/entity/Mob;finalizeSpawn(Lnet/minecraft/world/level/ServerLevelAccessor;Lnet/minecraft/world/DifficultyInstance;Lnet/minecraft/world/entity/MobSpawnType;Lnet/minecraft/world/entity/SpawnGroupData;)Lnet/minecraft/world/entity/SpawnGroupData;"
|
target = "Lnet/minecraft/world/entity/Mob;finalizeSpawn(Lnet/minecraft/world/level/ServerLevelAccessor;Lnet/minecraft/world/DifficultyInstance;Lnet/minecraft/world/entity/EntitySpawnReason;Lnet/minecraft/world/entity/SpawnGroupData;)Lnet/minecraft/world/entity/SpawnGroupData;"
|
||||||
))
|
))
|
||||||
private static SpawnGroupData spawnEntity(Mob mobEntity, ServerLevelAccessor serverWorldAccess, DifficultyInstance difficulty, MobSpawnType spawnReason, SpawnGroupData entityData)
|
private static SpawnGroupData spawnEntity(Mob mobEntity, ServerLevelAccessor serverWorldAccess, DifficultyInstance difficulty, EntitySpawnReason spawnReason, SpawnGroupData entityData)
|
||||||
{
|
{
|
||||||
if (!SpawnReporter.mockSpawns) // WorldAccess
|
if (!SpawnReporter.mockSpawns) // WorldAccess
|
||||||
return mobEntity.finalizeSpawn(serverWorldAccess, difficulty, spawnReason, entityData);
|
return mobEntity.finalizeSpawn(serverWorldAccess, difficulty, spawnReason, entityData);
|
||||||
@@ -271,17 +271,13 @@ public class NaturalSpawnerMixin
|
|||||||
@Inject(method = "spawnForChunk", at = @At("HEAD"))
|
@Inject(method = "spawnForChunk", at = @At("HEAD"))
|
||||||
// allows to change mobcaps and captures each category try per dimension before it fails due to full mobcaps.
|
// allows to change mobcaps and captures each category try per dimension before it fails due to full mobcaps.
|
||||||
private static void checkSpawns(ServerLevel world, LevelChunk chunk, NaturalSpawner.SpawnState info,
|
private static void checkSpawns(ServerLevel world, LevelChunk chunk, NaturalSpawner.SpawnState info,
|
||||||
boolean spawnAnimals, boolean spawnMonsters, boolean shouldSpawnAnimals, CallbackInfo ci)
|
List<MobCategory> list, CallbackInfo ci)
|
||||||
{
|
{
|
||||||
if (SpawnReporter.trackingSpawns())
|
if (SpawnReporter.trackingSpawns())
|
||||||
{
|
{
|
||||||
MobCategory[] var6 = SPAWNING_CATEGORIES;
|
for (MobCategory entityCategory: list)
|
||||||
int var7 = var6.length;
|
{
|
||||||
|
|
||||||
for(int var8 = 0; var8 < var7; ++var8) {
|
|
||||||
MobCategory entityCategory = var6[var8];
|
|
||||||
if ((spawnAnimals || !entityCategory.isFriendly()) && (spawnMonsters || entityCategory.isFriendly()) && (shouldSpawnAnimals || !entityCategory.isPersistent()) )
|
|
||||||
{
|
|
||||||
ResourceKey<Level> dim = world.dimension(); // getDimensionType;
|
ResourceKey<Level> dim = world.dimension(); // getDimensionType;
|
||||||
int newCap = entityCategory.getMaxInstancesPerChunk(); //(int) ((double)entityCategory.getCapacity()*(Math.pow(2.0,(SpawnReporter.mobcap_exponent/4))));
|
int newCap = entityCategory.getMaxInstancesPerChunk(); //(int) ((double)entityCategory.getCapacity()*(Math.pow(2.0,(SpawnReporter.mobcap_exponent/4))));
|
||||||
int int_2 = SpawnReporter.chunkCounts.get(dim); // eligible chunks for spawning
|
int int_2 = SpawnReporter.chunkCounts.get(dim); // eligible chunks for spawning
|
||||||
@@ -311,7 +307,6 @@ public class NaturalSpawnerMixin
|
|||||||
//else
|
//else
|
||||||
//full mobcaps - and key in local_spawns will be missing
|
//full mobcaps - and key in local_spawns will be missing
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,24 @@
|
|||||||
package carpet.mixins;
|
package carpet.mixins;
|
||||||
|
|
||||||
import carpet.CarpetSettings;
|
import carpet.CarpetSettings;
|
||||||
import net.minecraft.commands.CommandSourceStack;
|
import net.minecraft.commands.Commands;
|
||||||
|
import net.minecraft.commands.PermissionSource;
|
||||||
import net.minecraft.server.commands.PerfCommand;
|
import net.minecraft.server.commands.PerfCommand;
|
||||||
|
import net.minecraft.server.commands.PermissionCheck;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
|
||||||
|
|
||||||
@Mixin(PerfCommand.class)
|
@Mixin(PerfCommand.class)
|
||||||
public class PerfCommand_permissionMixin
|
public class PerfCommand_permissionMixin
|
||||||
{
|
{
|
||||||
@Inject(method = "method_37340", at = @At("HEAD"), cancellable = true, remap = false)
|
@Redirect(method = "register", at = @At(
|
||||||
private static void canRun(CommandSourceStack source, CallbackInfoReturnable<Boolean> cir)
|
value = "INVOKE",
|
||||||
|
target = "Lnet/minecraft/commands/Commands;hasPermission(I)Lnet/minecraft/server/commands/PermissionCheck;"
|
||||||
|
))
|
||||||
|
private static PermissionCheck<PermissionSource> canRun(int i)
|
||||||
{
|
{
|
||||||
cir.setReturnValue(source.hasPermission(CarpetSettings.perfPermissionLevel));
|
return Commands.hasPermission(CarpetSettings.perfPermissionLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
package carpet.mixins;
|
|
||||||
|
|
||||||
import carpet.CarpetSettings;
|
|
||||||
import net.minecraft.core.component.DataComponents;
|
|
||||||
import net.minecraft.tags.TagKey;
|
|
||||||
import net.minecraft.world.item.DiggerItem;
|
|
||||||
import net.minecraft.world.item.ItemStack;
|
|
||||||
import net.minecraft.world.item.PickaxeItem;
|
|
||||||
import net.minecraft.world.item.Tier;
|
|
||||||
import net.minecraft.world.item.component.Tool;
|
|
||||||
import net.minecraft.world.level.block.Block;
|
|
||||||
import net.minecraft.world.level.block.Blocks;
|
|
||||||
import net.minecraft.world.level.block.SoundType;
|
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
|
|
||||||
@Mixin(PickaxeItem.class)
|
|
||||||
public class PickaxeItem_missingToolsMixin extends DiggerItem
|
|
||||||
{
|
|
||||||
|
|
||||||
protected PickaxeItem_missingToolsMixin(Tier material, TagKey<Block> tag, Properties settings) {
|
|
||||||
super(material, tag, settings);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public float getDestroySpeed(ItemStack stack, BlockState state) {
|
|
||||||
if (CarpetSettings.missingTools && state.getSoundType() == SoundType.GLASS)
|
|
||||||
{
|
|
||||||
final Tool tool = stack.get(DataComponents.TOOL);
|
|
||||||
return tool != null ? tool.getMiningSpeed(Blocks.STONE.defaultBlockState()) : super.getDestroySpeed(stack, state);
|
|
||||||
}
|
|
||||||
return super.getDestroySpeed(stack, state);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -3,6 +3,12 @@ package carpet.mixins;
|
|||||||
import carpet.CarpetSettings;
|
import carpet.CarpetSettings;
|
||||||
import carpet.fakes.PistonBlockEntityInterface;
|
import carpet.fakes.PistonBlockEntityInterface;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
|
||||||
|
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
|
||||||
|
import com.llamalad7.mixinextras.sugar.Local;
|
||||||
|
import com.llamalad7.mixinextras.sugar.Share;
|
||||||
|
import com.llamalad7.mixinextras.sugar.ref.LocalRef;
|
||||||
|
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.core.Direction;
|
import net.minecraft.core.Direction;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
@@ -11,7 +17,6 @@ import net.minecraft.world.level.block.Blocks;
|
|||||||
import net.minecraft.world.level.block.CommandBlock;
|
import net.minecraft.world.level.block.CommandBlock;
|
||||||
import net.minecraft.world.level.block.DirectionalBlock;
|
import net.minecraft.world.level.block.DirectionalBlock;
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||||
import net.minecraft.world.level.block.piston.MovingPistonBlock;
|
|
||||||
import net.minecraft.world.level.block.piston.PistonBaseBlock;
|
import net.minecraft.world.level.block.piston.PistonBaseBlock;
|
||||||
import net.minecraft.world.level.block.piston.PistonStructureResolver;
|
import net.minecraft.world.level.block.piston.PistonStructureResolver;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
@@ -33,8 +38,6 @@ public abstract class PistonBaseBlock_movableBEMixin extends DirectionalBlock
|
|||||||
{
|
{
|
||||||
super(block$Settings_1);
|
super(block$Settings_1);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ThreadLocal<List<BlockEntity>> list1_BlockEntities = new ThreadLocal<>(); //Unneccessary ThreadLocal if client and server use different PistonBlock instances
|
|
||||||
|
|
||||||
@Inject(method = "isPushable", cancellable = true, at = @At(value = "RETURN", ordinal = 3, shift = At.Shift.BEFORE))
|
@Inject(method = "isPushable", cancellable = true, at = @At(value = "RETURN", ordinal = 3, shift = At.Shift.BEFORE))
|
||||||
private static void movableCMD(BlockState blockState_1, Level world_1, BlockPos blockPos_1,
|
private static void movableCMD(BlockState blockState_1, Level world_1, BlockPos blockPos_1,
|
||||||
@@ -53,7 +56,8 @@ public abstract class PistonBaseBlock_movableBEMixin extends DirectionalBlock
|
|||||||
//Making PISTON_EXTENSION (BlockPistonMoving) pushable would not work as its createNewTileEntity()-method returns null
|
//Making PISTON_EXTENSION (BlockPistonMoving) pushable would not work as its createNewTileEntity()-method returns null
|
||||||
return block != Blocks.ENDER_CHEST && block != Blocks.ENCHANTING_TABLE &&
|
return block != Blocks.ENDER_CHEST && block != Blocks.ENCHANTING_TABLE &&
|
||||||
block != Blocks.END_GATEWAY && block != Blocks.END_PORTAL && block != Blocks.MOVING_PISTON &&
|
block != Blocks.END_GATEWAY && block != Blocks.END_PORTAL && block != Blocks.MOVING_PISTON &&
|
||||||
block != Blocks.SPAWNER;
|
block != Blocks.SPAWNER
|
||||||
|
&& block != Blocks.SCULK_SENSOR && block != Blocks.CALIBRATED_SCULK_SENSOR; // these have weird behaviour and crashes, #1473, also #1885
|
||||||
}
|
}
|
||||||
|
|
||||||
@Redirect(method = "isPushable", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/BlockState;hasBlockEntity()Z"))
|
@Redirect(method = "isPushable", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/BlockState;hasBlockEntity()Z"))
|
||||||
@@ -84,17 +88,17 @@ public abstract class PistonBaseBlock_movableBEMixin extends DirectionalBlock
|
|||||||
private void onMove(Level world_1, BlockPos blockPos_1, Direction direction_1, boolean boolean_1,
|
private void onMove(Level world_1, BlockPos blockPos_1, Direction direction_1, boolean boolean_1,
|
||||||
CallbackInfoReturnable<Boolean> cir, BlockPos blockPos_2, PistonStructureResolver pistonHandler_1, Map<?, ?> map_1,
|
CallbackInfoReturnable<Boolean> cir, BlockPos blockPos_2, PistonStructureResolver pistonHandler_1, Map<?, ?> map_1,
|
||||||
List<BlockPos> list_1, List<BlockState> list_2, List<?> list_3, BlockState[] blockStates_1,
|
List<BlockPos> list_1, List<BlockState> list_2, List<?> list_3, BlockState[] blockStates_1,
|
||||||
Direction direction_2, int int_2)
|
Direction direction_2, int int_2, @Share("blockEntities") LocalRef<List<BlockEntity>> blockEntities)
|
||||||
{
|
{
|
||||||
//Get the blockEntities and remove them from the world before any magic starts to happen
|
//Get the blockEntities and remove them from the world before any magic starts to happen
|
||||||
if (CarpetSettings.movableBlockEntities)
|
if (CarpetSettings.movableBlockEntities)
|
||||||
{
|
{
|
||||||
list1_BlockEntities.set(Lists.newArrayList());
|
blockEntities.set(Lists.newArrayList());
|
||||||
for (int i = 0; i < list_1.size(); ++i)
|
for (int i = 0; i < list_1.size(); ++i)
|
||||||
{
|
{
|
||||||
BlockPos blockpos = list_1.get(i);
|
BlockPos blockpos = list_1.get(i);
|
||||||
BlockEntity blockEntity = (list_2.get(i).hasBlockEntity()) ? world_1.getBlockEntity(blockpos) : null;
|
BlockEntity blockEntity = (list_2.get(i).hasBlockEntity()) ? world_1.getBlockEntity(blockpos) : null;
|
||||||
list1_BlockEntities.get().add(blockEntity);
|
blockEntities.get().add(blockEntity);
|
||||||
if (blockEntity != null)
|
if (blockEntity != null)
|
||||||
{
|
{
|
||||||
//hopefully this call won't have any side effects in the future, such as dropping all the BlockEntity's items
|
//hopefully this call won't have any side effects in the future, such as dropping all the BlockEntity's items
|
||||||
@@ -105,35 +109,15 @@ public abstract class PistonBaseBlock_movableBEMixin extends DirectionalBlock
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "moveBlocks", at = @At(value = "INVOKE", shift = At.Shift.BEFORE,
|
@WrapOperation(method = "moveBlocks", at = @At(value = "INVOKE",
|
||||||
target = "Lnet/minecraft/world/level/Level;setBlockEntity(Lnet/minecraft/world/level/block/entity/BlockEntity;)V", ordinal = 0),
|
|
||||||
locals = LocalCapture.CAPTURE_FAILHARD)
|
|
||||||
private void setBlockEntityWithCarried(Level world_1, BlockPos blockPos_1, Direction direction_1, boolean boolean_1,
|
|
||||||
CallbackInfoReturnable<Boolean> cir, BlockPos blockPos_2, PistonStructureResolver pistonHandler_1, Map<?, ?> map_1, List<?> list_1,
|
|
||||||
List<BlockState> list_2, List<?> list_3, BlockState[] blockStates_1, Direction direction_2, int int_2,
|
|
||||||
int int_3, BlockPos blockPos_4, BlockState blockState9, BlockState blockState4)
|
|
||||||
{
|
|
||||||
BlockEntity blockEntityPiston = MovingPistonBlock.newMovingBlockEntity(blockPos_4, blockState4, list_2.get(int_3),
|
|
||||||
direction_1, boolean_1, false);
|
|
||||||
if (CarpetSettings.movableBlockEntities)
|
|
||||||
((PistonBlockEntityInterface) blockEntityPiston).setCarriedBlockEntity(list1_BlockEntities.get().get(int_3));
|
|
||||||
world_1.setBlockEntity(blockEntityPiston);
|
|
||||||
//world_1.setBlockEntity(blockPos_4, blockEntityPiston);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Redirect(method = "moveBlocks", at = @At(value = "INVOKE",
|
|
||||||
target = "Lnet/minecraft/world/level/Level;setBlockEntity(Lnet/minecraft/world/level/block/entity/BlockEntity;)V",
|
target = "Lnet/minecraft/world/level/Level;setBlockEntity(Lnet/minecraft/world/level/block/entity/BlockEntity;)V",
|
||||||
ordinal = 0))
|
ordinal = 0))
|
||||||
private void dontDoAnything(Level world, BlockEntity blockEntity)
|
private void setCarriedOnMove(Level instance, BlockEntity blockEntity, Operation<Void> original,
|
||||||
|
@Local(ordinal = 1) int index, @Share("blockEntities") LocalRef<List<BlockEntity>> blockEntities)
|
||||||
{
|
{
|
||||||
}
|
if (CarpetSettings.movableBlockEntities)
|
||||||
|
((PistonBlockEntityInterface) blockEntity).setCarriedBlockEntity(blockEntities.get().get(index));
|
||||||
@Redirect(method = "moveBlocks", at = @At(value = "INVOKE",
|
original.call(instance, blockEntity);
|
||||||
target = "Lnet/minecraft/world/level/block/piston/MovingPistonBlock;newMovingBlockEntity(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/Direction;ZZ)Lnet/minecraft/world/level/block/entity/BlockEntity;",
|
|
||||||
ordinal = 0))
|
|
||||||
private BlockEntity returnNull(BlockPos blockPos, BlockState blockState, BlockState blockState2, Direction direction, boolean bl, boolean bl2)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -10,6 +10,7 @@ import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
|
|||||||
import net.minecraft.client.renderer.blockentity.PistonHeadRenderer;
|
import net.minecraft.client.renderer.blockentity.PistonHeadRenderer;
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||||
import net.minecraft.world.level.block.piston.PistonMovingBlockEntity;
|
import net.minecraft.world.level.block.piston.PistonMovingBlockEntity;
|
||||||
|
import net.minecraft.world.phys.Vec3;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
@@ -27,8 +28,9 @@ public abstract class PistonHeadRenderer_movableBEMixin implements BlockEntityRe
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "render", at = @At(value = "INVOKE",
|
@Inject(method = "render", at = @At(value = "INVOKE",
|
||||||
target = "Lnet/minecraft/client/renderer/blockentity/PistonHeadRenderer;renderBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;Lnet/minecraft/world/level/Level;ZI)V", ordinal = 3))
|
target = "Lnet/minecraft/client/renderer/blockentity/PistonHeadRenderer;renderBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;Lnet/minecraft/world/level/Level;ZI)V",
|
||||||
private void updateRenderBool(PistonMovingBlockEntity pistonBlockEntity_1, float float_1, PoseStack matrixStack_1, MultiBufferSource layeredVertexConsumerStorage_1, int int_1, int int_2, CallbackInfo ci)
|
ordinal = 3))
|
||||||
|
private void updateRenderBool(PistonMovingBlockEntity pistonBlockEntity_1, float float_1, PoseStack matrixStack_1, MultiBufferSource layeredVertexConsumerStorage_1, int int_1, int int_2, Vec3 cameraPos, CallbackInfo ci)
|
||||||
//private void updateRenderBool(PistonBlockEntity pistonBlockEntity_1, double double_1, double double_2, double double_3, float float_1, class_4587 class_4587_1, class_4597 class_4597_1, int int_1, CallbackInfo ci)
|
//private void updateRenderBool(PistonBlockEntity pistonBlockEntity_1, double double_1, double double_2, double double_3, float float_1, class_4587 class_4587_1, class_4597 class_4597_1, int int_1, CallbackInfo ci)
|
||||||
{
|
{
|
||||||
if (!((PistonBlockEntityInterface) pistonBlockEntity_1).isRenderModeSet())
|
if (!((PistonBlockEntityInterface) pistonBlockEntity_1).isRenderModeSet())
|
||||||
@@ -37,7 +39,7 @@ public abstract class PistonHeadRenderer_movableBEMixin implements BlockEntityRe
|
|||||||
|
|
||||||
|
|
||||||
@Inject(method = "render", at = @At("RETURN"), locals = LocalCapture.NO_CAPTURE)
|
@Inject(method = "render", at = @At("RETURN"), locals = LocalCapture.NO_CAPTURE)
|
||||||
private void endMethod3576(PistonMovingBlockEntity pistonBlockEntity_1, float partialTicks, PoseStack matrixStack_1, MultiBufferSource layeredVertexConsumerStorage_1, int int_1, int init_2, CallbackInfo ci)
|
private void endMethod3576(PistonMovingBlockEntity pistonBlockEntity_1, float partialTicks, PoseStack matrixStack_1, MultiBufferSource layeredVertexConsumerStorage_1, int int_1, int init_2, Vec3 cameraPos, CallbackInfo ci)
|
||||||
{
|
{
|
||||||
if (((PistonBlockEntityInterface) pistonBlockEntity_1).getRenderCarriedBlockEntity())
|
if (((PistonBlockEntityInterface) pistonBlockEntity_1).getRenderCarriedBlockEntity())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -15,6 +15,10 @@ import net.minecraft.world.level.block.entity.BlockEntity;
|
|||||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||||
import net.minecraft.world.level.block.piston.PistonMovingBlockEntity;
|
import net.minecraft.world.level.block.piston.PistonMovingBlockEntity;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
import net.minecraft.world.level.storage.TagValueInput;
|
||||||
|
import net.minecraft.world.level.storage.TagValueOutput;
|
||||||
|
import net.minecraft.world.level.storage.ValueInput;
|
||||||
|
import net.minecraft.world.level.storage.ValueOutput;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
@@ -134,25 +138,25 @@ public abstract class PistonMovingBlockEntity_movableBEMixin extends BlockEntity
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "loadAdditional", at = @At(value = "TAIL"))
|
@Inject(method = "loadAdditional", at = @At(value = "TAIL"))
|
||||||
private void onFromTag(CompoundTag NbtCompound_1, HolderLookup.Provider registries, CallbackInfo ci)
|
private void onFromTag(ValueInput valueInput, CallbackInfo ci)
|
||||||
{
|
{
|
||||||
if (CarpetSettings.movableBlockEntities && NbtCompound_1.contains("carriedTileEntityCM", 10))
|
if (CarpetSettings.movableBlockEntities)
|
||||||
{
|
valueInput.child("carriedTileEntityCM").ifPresent(tag -> {
|
||||||
if (this.movedState.getBlock() instanceof EntityBlock)
|
if (this.movedState.getBlock() instanceof EntityBlock)
|
||||||
this.carriedBlockEntity = ((EntityBlock) (this.movedState.getBlock())).newBlockEntity(worldPosition, movedState);// this.world);
|
this.carriedBlockEntity = ((EntityBlock) (this.movedState.getBlock())).newBlockEntity(worldPosition, movedState);// this.world);
|
||||||
if (carriedBlockEntity != null) //Can actually be null, as BlockPistonMoving.createNewTileEntity(...) returns null
|
if (carriedBlockEntity != null) //Can actually be null, as BlockPistonMoving.createNewTileEntity(...) returns null
|
||||||
this.carriedBlockEntity.loadWithComponents(NbtCompound_1.getCompound("carriedTileEntityCM"), registries);
|
this.carriedBlockEntity.loadWithComponents(tag);
|
||||||
setCarriedBlockEntity(carriedBlockEntity);
|
setCarriedBlockEntity(carriedBlockEntity);
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "saveAdditional", at = @At(value = "RETURN", shift = At.Shift.BEFORE))
|
@Inject(method = "saveAdditional", at = @At(value = "RETURN", shift = At.Shift.BEFORE))
|
||||||
private void onToTag(CompoundTag NbtCompound_1, HolderLookup.Provider registries, CallbackInfo ci)
|
private void onToTag(ValueOutput valueOutput, CallbackInfo ci)
|
||||||
{
|
{
|
||||||
if (CarpetSettings.movableBlockEntities && this.carriedBlockEntity != null)
|
if (CarpetSettings.movableBlockEntities && this.carriedBlockEntity != null && valueOutput instanceof TagValueOutput output)
|
||||||
{
|
{
|
||||||
//Leave name "carriedTileEntityCM" instead of "carriedBlockEntityCM" for upgrade compatibility with 1.13.2 movable TE
|
//Leave name "carriedTileEntityCM" instead of "carriedBlockEntityCM" for upgrade compatibility with 1.13.2 movable TE
|
||||||
NbtCompound_1.put("carriedTileEntityCM", this.carriedBlockEntity.saveWithoutMetadata(registries));
|
this.carriedBlockEntity.saveWithoutMetadata(output.child("carriedTileEntityCM"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -10,6 +10,8 @@ import net.minecraft.server.level.ServerPlayer;
|
|||||||
import net.minecraft.server.network.CommonListenerCookie;
|
import net.minecraft.server.network.CommonListenerCookie;
|
||||||
import net.minecraft.server.network.ServerGamePacketListenerImpl;
|
import net.minecraft.server.network.ServerGamePacketListenerImpl;
|
||||||
import net.minecraft.server.players.PlayerList;
|
import net.minecraft.server.players.PlayerList;
|
||||||
|
import net.minecraft.util.ProblemReporter;
|
||||||
|
import net.minecraft.world.level.storage.ValueInput;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
@@ -20,6 +22,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
|||||||
import carpet.patches.NetHandlerPlayServerFake;
|
import carpet.patches.NetHandlerPlayServerFake;
|
||||||
import carpet.patches.EntityPlayerMPFake;
|
import carpet.patches.EntityPlayerMPFake;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
@Mixin(PlayerList.class)
|
@Mixin(PlayerList.class)
|
||||||
public abstract class PlayerList_fakePlayersMixin
|
public abstract class PlayerList_fakePlayersMixin
|
||||||
{
|
{
|
||||||
@@ -28,11 +32,11 @@ public abstract class PlayerList_fakePlayersMixin
|
|||||||
private MinecraftServer server;
|
private MinecraftServer server;
|
||||||
|
|
||||||
@Inject(method = "load", at = @At(value = "RETURN", shift = At.Shift.BEFORE))
|
@Inject(method = "load", at = @At(value = "RETURN", shift = At.Shift.BEFORE))
|
||||||
private void fixStartingPos(ServerPlayer serverPlayerEntity_1, CallbackInfoReturnable<CompoundTag> cir)
|
private void fixStartingPos(ServerPlayer serverPlayer, ProblemReporter problemReporter, CallbackInfoReturnable<Optional<ValueInput>> cir)
|
||||||
{
|
{
|
||||||
if (serverPlayerEntity_1 instanceof EntityPlayerMPFake)
|
if (serverPlayer instanceof EntityPlayerMPFake)
|
||||||
{
|
{
|
||||||
((EntityPlayerMPFake) serverPlayerEntity_1).fixStartingPosition.run();
|
((EntityPlayerMPFake) serverPlayer).fixStartingPosition.run();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,11 +2,15 @@ package carpet.mixins;
|
|||||||
|
|
||||||
import carpet.CarpetSettings;
|
import carpet.CarpetSettings;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
|
import net.minecraft.world.entity.EntityType;
|
||||||
import net.minecraft.world.entity.EquipmentSlot;
|
import net.minecraft.world.entity.EquipmentSlot;
|
||||||
|
import net.minecraft.world.entity.LivingEntity;
|
||||||
|
import net.minecraft.world.entity.player.Inventory;
|
||||||
import net.minecraft.world.entity.player.Player;
|
import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraft.world.item.ElytraItem;
|
//import net.minecraft.world.item.ElytraItem;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
|
import net.minecraft.world.level.Level;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
@@ -14,19 +18,24 @@ import org.spongepowered.asm.mixin.injection.Inject;
|
|||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
@Mixin(Player.class)
|
@Mixin(Player.class)
|
||||||
public abstract class Player_antiCheatDisabledMixin
|
public abstract class Player_antiCheatDisabledMixin extends LivingEntity
|
||||||
{
|
{
|
||||||
@Shadow public abstract ItemStack getItemBySlot(EquipmentSlot equipmentSlot_1);
|
protected Player_antiCheatDisabledMixin(final EntityType<? extends LivingEntity> entityType, final Level level)
|
||||||
|
{
|
||||||
|
super(entityType, level);
|
||||||
|
}
|
||||||
|
|
||||||
@Shadow public abstract void startFallFlying();
|
@Shadow public abstract void startFallFlying();
|
||||||
|
|
||||||
|
@Shadow public abstract Inventory getInventory();
|
||||||
|
|
||||||
@Inject(method = "tryToStartFallFlying", at = @At("HEAD"), cancellable = true)
|
@Inject(method = "tryToStartFallFlying", at = @At("HEAD"), cancellable = true)
|
||||||
private void allowDeploys(CallbackInfoReturnable<Boolean> cir)
|
private void allowDeploys(CallbackInfoReturnable<Boolean> cir)
|
||||||
{
|
{
|
||||||
if (CarpetSettings.antiCheatDisabled && (Object)this instanceof ServerPlayer sp && sp.getServer().isDedicatedServer())
|
if (CarpetSettings.antiCheatDisabled && (Object)this instanceof ServerPlayer sp && sp.getServer().isDedicatedServer())
|
||||||
{
|
{
|
||||||
ItemStack itemStack_1 = getItemBySlot(EquipmentSlot.CHEST);
|
ItemStack itemStack_1 = equipment.get(EquipmentSlot.CHEST);
|
||||||
if (itemStack_1.getItem() == Items.ELYTRA && ElytraItem.isFlyEnabled(itemStack_1)) {
|
if (itemStack_1.getItem() == Items.ELYTRA && !itemStack_1.nextDamageWillBreak()) {
|
||||||
startFallFlying();
|
startFallFlying();
|
||||||
cir.setReturnValue(true);
|
cir.setReturnValue(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package carpet.mixins;
|
|||||||
|
|
||||||
import carpet.CarpetSettings;
|
import carpet.CarpetSettings;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.world.damagesource.DamageSource;
|
import net.minecraft.world.damagesource.DamageSource;
|
||||||
import net.minecraft.world.entity.EntityType;
|
import net.minecraft.world.entity.EntityType;
|
||||||
import net.minecraft.world.entity.LivingEntity;
|
import net.minecraft.world.entity.LivingEntity;
|
||||||
@@ -57,7 +58,7 @@ public abstract class Player_parrotMixin extends LivingEntity
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Redirect(method = "hurt", at = @At(value = "INVOKE",
|
@Redirect(method = "hurtServer", at = @At(value = "INVOKE",
|
||||||
target = "Lnet/minecraft/world/entity/player/Player;removeEntitiesOnShoulder()V"))
|
target = "Lnet/minecraft/world/entity/player/Player;removeEntitiesOnShoulder()V"))
|
||||||
private void cancelDropShoulderEntities2(Player playerEntity)
|
private void cancelDropShoulderEntities2(Player playerEntity)
|
||||||
{
|
{
|
||||||
@@ -76,9 +77,9 @@ public abstract class Player_parrotMixin extends LivingEntity
|
|||||||
this.setShoulderEntityRight(new CompoundTag());
|
this.setShoulderEntityRight(new CompoundTag());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "hurt", at = @At(value = "INVOKE", shift = At.Shift.BEFORE,
|
@Inject(method = "hurtServer", at = @At(value = "INVOKE", shift = At.Shift.BEFORE,
|
||||||
target = "Lnet/minecraft/world/entity/player/Player;removeEntitiesOnShoulder()V"))
|
target = "Lnet/minecraft/world/entity/player/Player;removeEntitiesOnShoulder()V"))
|
||||||
private void onDamage(DamageSource damageSource_1, float float_1, CallbackInfoReturnable<Boolean> cir)
|
private void onDamage(ServerLevel serverLevel, DamageSource damageSource_1, float float_1, CallbackInfoReturnable<Boolean> cir)
|
||||||
{
|
{
|
||||||
if (CarpetSettings.persistentParrots && !this.isShiftKeyDown())
|
if (CarpetSettings.persistentParrots && !this.isShiftKeyDown())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package carpet.mixins;
|
|||||||
|
|
||||||
import carpet.fakes.EntityInterface;
|
import carpet.fakes.EntityInterface;
|
||||||
import carpet.script.EntityEventsGroup;
|
import carpet.script.EntityEventsGroup;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
import net.minecraft.world.InteractionHand;
|
import net.minecraft.world.InteractionHand;
|
||||||
import net.minecraft.world.InteractionResult;
|
import net.minecraft.world.InteractionResult;
|
||||||
@@ -36,7 +37,7 @@ public abstract class Player_scarpetEventsMixin extends LivingEntity
|
|||||||
value = "INVOKE",
|
value = "INVOKE",
|
||||||
target = "Lnet/minecraft/world/entity/player/Player;getDamageAfterArmorAbsorb(Lnet/minecraft/world/damagesource/DamageSource;F)F"
|
target = "Lnet/minecraft/world/entity/player/Player;getDamageAfterArmorAbsorb(Lnet/minecraft/world/damagesource/DamageSource;F)F"
|
||||||
))
|
))
|
||||||
private void playerTakingDamage(DamageSource source, float amount, CallbackInfo ci)
|
private void playerTakingDamage(ServerLevel serverLevel, DamageSource source, float amount, CallbackInfo ci)
|
||||||
{
|
{
|
||||||
// version of LivingEntity_scarpetEventsMixin::entityTakingDamage
|
// version of LivingEntity_scarpetEventsMixin::entityTakingDamage
|
||||||
((EntityInterface)this).getEventContainer().onEvent(EntityEventsGroup.Event.ON_DAMAGE, amount, source);
|
((EntityInterface)this).getEventContainer().onEvent(EntityEventsGroup.Event.ON_DAMAGE, amount, source);
|
||||||
|
|||||||
@@ -1,50 +0,0 @@
|
|||||||
package carpet.mixins;
|
|
||||||
|
|
||||||
import carpet.fakes.RecipeManagerInterface;
|
|
||||||
import com.google.common.collect.Multimap;
|
|
||||||
import net.minecraft.core.Registry;
|
|
||||||
import net.minecraft.core.RegistryAccess;
|
|
||||||
import net.minecraft.core.registries.Registries;
|
|
||||||
import net.minecraft.world.item.Item;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import net.minecraft.resources.ResourceLocation;
|
|
||||||
import net.minecraft.world.item.crafting.Recipe;
|
|
||||||
import net.minecraft.world.item.crafting.RecipeHolder;
|
|
||||||
import net.minecraft.world.item.crafting.RecipeManager;
|
|
||||||
import net.minecraft.world.item.crafting.RecipeType;
|
|
||||||
|
|
||||||
@Mixin(RecipeManager.class)
|
|
||||||
public class RecipeManager_scarpetMixin implements RecipeManagerInterface
|
|
||||||
{
|
|
||||||
@Shadow private Multimap<RecipeType<?>, RecipeHolder<?>> byType;
|
|
||||||
|
|
||||||
@Shadow private Map<ResourceLocation, RecipeHolder<?>> byName;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<Recipe<?>> getAllMatching(RecipeType<?> type, ResourceLocation itemId, RegistryAccess registryAccess)
|
|
||||||
{
|
|
||||||
// quiq cheq
|
|
||||||
RecipeHolder<?> recipe = byName.get(itemId);
|
|
||||||
if (recipe != null && recipe.value().getType().equals(type))
|
|
||||||
{
|
|
||||||
return List.of(recipe.value());
|
|
||||||
}
|
|
||||||
if (!byType.containsKey(type))
|
|
||||||
{
|
|
||||||
// happens when mods add recipe to the registry without updating recipe manager
|
|
||||||
return List.of();
|
|
||||||
}
|
|
||||||
Collection<RecipeHolder<?>> typeRecipes = byType.get(type);
|
|
||||||
Registry<Item> regs = registryAccess.registryOrThrow(Registries.ITEM);
|
|
||||||
Item item = regs.get(itemId);
|
|
||||||
return typeRecipes.stream()
|
|
||||||
.<Recipe<?>>map(RecipeHolder::value)
|
|
||||||
.filter(r -> r.getResultItem(registryAccess).getItem() == item)
|
|
||||||
.toList();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +1,13 @@
|
|||||||
package carpet.mixins;
|
package carpet.mixins;
|
||||||
|
|
||||||
import carpet.CarpetSettings;
|
import carpet.CarpetSettings;
|
||||||
|
import carpet.fakes.DefaultRedstoneWireEvaluatorInferface;
|
||||||
import carpet.fakes.RedstoneWireBlockInterface;
|
import carpet.fakes.RedstoneWireBlockInterface;
|
||||||
import carpet.helpers.RedstoneWireTurbo;
|
import carpet.helpers.RedstoneWireTurbo;
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
|
import net.minecraft.world.level.redstone.DefaultRedstoneWireEvaluator;
|
||||||
|
import net.minecraft.world.level.redstone.Orientation;
|
||||||
|
import net.minecraft.world.level.redstone.RedstoneWireEvaluator;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||||
@@ -21,16 +25,15 @@ import net.minecraft.world.level.block.RedStoneWireBlock;
|
|||||||
import net.minecraft.world.level.block.state.BlockBehaviour;
|
import net.minecraft.world.level.block.state.BlockBehaviour;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import static net.minecraft.world.level.block.RedStoneWireBlock.POWER;
|
import static net.minecraft.world.level.block.RedStoneWireBlock.POWER;
|
||||||
|
|
||||||
@Mixin(RedStoneWireBlock.class)
|
@Mixin(RedStoneWireBlock.class)
|
||||||
public abstract class RedstoneWireBlock_fastMixin implements RedstoneWireBlockInterface {
|
public abstract class RedstoneWireBlock_fastMixin implements RedstoneWireBlockInterface {
|
||||||
|
|
||||||
@Shadow
|
@Shadow
|
||||||
private void updatePowerStrength(Level world_1, BlockPos blockPos_1, BlockState blockState_1) { }
|
private void updatePowerStrength(Level world_1, BlockPos blockPos_1, BlockState blockState_1, @Nullable final Orientation orientation, boolean sup) { }
|
||||||
|
|
||||||
@Shadow
|
|
||||||
private int calculateTargetStrength(Level world, BlockPos pos) { return 0; }
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Accessor("shouldSignal")
|
@Accessor("shouldSignal")
|
||||||
@@ -40,6 +43,8 @@ public abstract class RedstoneWireBlock_fastMixin implements RedstoneWireBlockIn
|
|||||||
@Accessor("shouldSignal")
|
@Accessor("shouldSignal")
|
||||||
public abstract boolean getWiresGivePower();
|
public abstract boolean getWiresGivePower();
|
||||||
|
|
||||||
|
private RedstoneWireEvaluator legacy = new DefaultRedstoneWireEvaluator((RedStoneWireBlock)(Object) this);
|
||||||
|
|
||||||
// =
|
// =
|
||||||
|
|
||||||
private RedstoneWireTurbo wireTurbo = null;
|
private RedstoneWireTurbo wireTurbo = null;
|
||||||
@@ -52,20 +57,22 @@ public abstract class RedstoneWireBlock_fastMixin implements RedstoneWireBlockIn
|
|||||||
|
|
||||||
// =
|
// =
|
||||||
|
|
||||||
public void fastUpdate(Level world, BlockPos pos, BlockState state, BlockPos source) {
|
public void fastUpdate(Level world, BlockPos pos, BlockState state, Orientation o, boolean sup) {
|
||||||
// [CM] fastRedstoneDust -- update based on carpet rule
|
// [CM] fastRedstoneDust -- update based on carpet rule
|
||||||
if (CarpetSettings.fastRedstoneDust) {
|
if (CarpetSettings.fastRedstoneDust) {
|
||||||
|
BlockPos source = null; // todo this probably removes all improvements from the original method
|
||||||
|
// so needs to be evaluated if its worth keeping
|
||||||
wireTurbo.updateSurroundingRedstone(world, pos, state, source);
|
wireTurbo.updateSurroundingRedstone(world, pos, state, source);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
updatePowerStrength(world, pos, state);
|
updatePowerStrength(world, pos, state, o, sup);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author theosib, soykaf, gnembon
|
* @author theosib, soykaf, gnembon
|
||||||
*/
|
*/
|
||||||
@Inject(method = "updatePowerStrength", at = @At("HEAD"), cancellable = true)
|
@Inject(method = "updatePowerStrength", at = @At("HEAD"), cancellable = true)
|
||||||
private void updateLogicAlternative(Level world, BlockPos pos, BlockState state, CallbackInfo cir) {
|
private void updateLogicAlternative(Level world, BlockPos pos, BlockState state, Orientation orientation, boolean sup, CallbackInfo cir) {
|
||||||
if (CarpetSettings.fastRedstoneDust) {
|
if (CarpetSettings.fastRedstoneDust) {
|
||||||
updateLogicPublic(world, pos, state);
|
updateLogicPublic(world, pos, state);
|
||||||
cir.cancel();
|
cir.cancel();
|
||||||
@@ -74,7 +81,7 @@ public abstract class RedstoneWireBlock_fastMixin implements RedstoneWireBlockIn
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockState updateLogicPublic(Level world_1, BlockPos blockPos_1, BlockState blockState_1) {
|
public BlockState updateLogicPublic(Level world_1, BlockPos blockPos_1, BlockState blockState_1) {
|
||||||
int i = this.calculateTargetStrength(world_1, blockPos_1);
|
int i = ((DefaultRedstoneWireEvaluatorInferface)legacy).calculateTargetStrengthCM(world_1, blockPos_1);
|
||||||
BlockState blockState = blockState_1;
|
BlockState blockState = blockState_1;
|
||||||
if (blockState_1.getValue(POWER) != i) {
|
if (blockState_1.getValue(POWER) != i) {
|
||||||
blockState_1 = blockState_1.setValue(POWER, i);
|
blockState_1 = blockState_1.setValue(POWER, i);
|
||||||
@@ -107,28 +114,37 @@ public abstract class RedstoneWireBlock_fastMixin implements RedstoneWireBlockIn
|
|||||||
// =
|
// =
|
||||||
|
|
||||||
|
|
||||||
@Redirect(method = "onPlace", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/RedStoneWireBlock;updatePowerStrength(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)V"))
|
@Redirect(method = "onPlace", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/RedStoneWireBlock;updatePowerStrength(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/redstone/Orientation;Z)V"))
|
||||||
private void redirectOnBlockAddedUpdate(RedStoneWireBlock self, Level world_1, BlockPos blockPos_1, BlockState blockState_1) {
|
private void redirectOnBlockAddedUpdate(RedStoneWireBlock self, Level world_1, BlockPos blockPos_1, BlockState blockState_1, Orientation o, boolean sup) {
|
||||||
fastUpdate(world_1, blockPos_1, blockState_1, null);
|
fastUpdate(world_1, blockPos_1, blockState_1, o, sup);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Redirect(method = "onRemove", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/RedStoneWireBlock;updatePowerStrength(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)V"))
|
@Redirect(method = "affectNeighborsAfterRemoval", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/RedStoneWireBlock;updatePowerStrength(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/redstone/Orientation;Z)V"))
|
||||||
private void redirectOnStateReplacedUpdate(RedStoneWireBlock self, Level world_1, BlockPos blockPos_1, BlockState blockState_1) {
|
private void redirectOnStateReplacedUpdate(RedStoneWireBlock self, Level world_1, BlockPos blockPos_1, BlockState blockState_1, Orientation o, boolean sup) {
|
||||||
fastUpdate(world_1, blockPos_1, blockState_1, null);
|
fastUpdate(world_1, blockPos_1, blockState_1, o, sup);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Redirect(method = "neighborChanged", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/RedStoneWireBlock;updatePowerStrength(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)V"))
|
@Redirect(method = "neighborChanged", at = @At(value = "INVOKE", target =
|
||||||
|
"Lnet/minecraft/world/level/block/RedStoneWireBlock;updatePowerStrength(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/redstone/Orientation;Z)V"
|
||||||
|
//"Lnet/minecraft/world/level/block/RedStoneWireBlock;updatePowerStrength(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/redstone/Orientation;)V"
|
||||||
|
))
|
||||||
|
//private void red(final RedStoneWireBlock instance, final Level level,
|
||||||
|
// final BlockPos blockPos, final BlockState blockState, final Orientation orientation)
|
||||||
private void redirectNeighborUpdateUpdate(
|
private void redirectNeighborUpdateUpdate(
|
||||||
RedStoneWireBlock self,
|
RedStoneWireBlock self,
|
||||||
Level world_1,
|
Level world_1,
|
||||||
BlockPos blockPos_1,
|
BlockPos blockPos_1,
|
||||||
BlockState blockState_1,
|
BlockState blockState_1,
|
||||||
|
Orientation o,
|
||||||
|
boolean sup,
|
||||||
BlockState blockState_2,
|
BlockState blockState_2,
|
||||||
Level world_2,
|
Level world_2,
|
||||||
BlockPos blockPos_2,
|
BlockPos blockPos_2,
|
||||||
Block block_1,
|
Block block_1,
|
||||||
BlockPos blockPos_3,
|
Orientation o2,
|
||||||
boolean boolean_1) {
|
boolean b
|
||||||
fastUpdate(world_1, blockPos_1, blockState_1, blockPos_3);
|
)
|
||||||
|
{
|
||||||
|
fastUpdate(world_1, blockPos_1, blockState_1, o, sup);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -27,7 +27,7 @@ public abstract class ServerChunkCacheMixin
|
|||||||
|
|
||||||
@Shadow @Final private DistanceManager distanceManager;
|
@Shadow @Final private DistanceManager distanceManager;
|
||||||
|
|
||||||
@Redirect(method = "tickChunks", at = @At(
|
@Redirect(method = "tickChunks(Lnet/minecraft/util/profiling/ProfilerFiller;J)V", at = @At(
|
||||||
value = "INVOKE",
|
value = "INVOKE",
|
||||||
target = "Lnet/minecraft/server/level/DistanceManager;getNaturalSpawnChunkCount()I"
|
target = "Lnet/minecraft/server/level/DistanceManager;getNaturalSpawnChunkCount()I"
|
||||||
))
|
))
|
||||||
@@ -54,7 +54,7 @@ public abstract class ServerChunkCacheMixin
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Inject(method = "tickChunks", at = @At("RETURN"))
|
@Inject(method = "tickChunks(Lnet/minecraft/util/profiling/ProfilerFiller;J)V", at = @At("RETURN"))
|
||||||
private void onFinishSpawnWorldCycle(CallbackInfo ci)
|
private void onFinishSpawnWorldCycle(CallbackInfo ci)
|
||||||
{
|
{
|
||||||
LevelData levelData = this.level.getLevelData(); // levelProperies class
|
LevelData levelData = this.level.getLevelData(); // levelProperies class
|
||||||
|
|||||||
@@ -19,36 +19,13 @@ public abstract class ServerChunkCache_profilerMixin
|
|||||||
|
|
||||||
CarpetProfiler.ProfilerToken currentSection;
|
CarpetProfiler.ProfilerToken currentSection;
|
||||||
|
|
||||||
@Inject(method = "tickChunks", at = @At("HEAD"))
|
@Inject(method = "tickChunks(Lnet/minecraft/util/profiling/ProfilerFiller;J)V", at = @At("HEAD"))
|
||||||
private void startSpawningSection(CallbackInfo ci)
|
private void startSpawningSection(CallbackInfo ci)
|
||||||
{
|
{
|
||||||
currentSection = CarpetProfiler.start_section(level, "Spawning", CarpetProfiler.TYPE.GENERAL);
|
currentSection = CarpetProfiler.start_section(level, "Spawning", CarpetProfiler.TYPE.GENERAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "tickChunks", at = @At(
|
@Inject(method = "tickChunks(Lnet/minecraft/util/profiling/ProfilerFiller;J)V", at = @At("RETURN"))
|
||||||
value = "FIELD",
|
|
||||||
target = "net/minecraft/server/level/ServerChunkCache.level:Lnet/minecraft/server/level/ServerLevel;",
|
|
||||||
ordinal = 10
|
|
||||||
))
|
|
||||||
private void skipChunkTicking(CallbackInfo ci)
|
|
||||||
{
|
|
||||||
if (currentSection != null)
|
|
||||||
{
|
|
||||||
CarpetProfiler.end_current_section(currentSection);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = "tickChunks", at = @At(
|
|
||||||
value = "INVOKE",
|
|
||||||
target = "net/minecraft/server/level/ServerLevel.tickChunk(Lnet/minecraft/world/level/chunk/LevelChunk;I)V",
|
|
||||||
shift = At.Shift.AFTER
|
|
||||||
))
|
|
||||||
private void resumeSpawningSection(CallbackInfo ci)
|
|
||||||
{
|
|
||||||
currentSection = CarpetProfiler.start_section(level, "Spawning", CarpetProfiler.TYPE.GENERAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = "tickChunks", at = @At("RETURN"))
|
|
||||||
private void stopSpawningSection(CallbackInfo ci)
|
private void stopSpawningSection(CallbackInfo ci)
|
||||||
{
|
{
|
||||||
if (currentSection != null)
|
if (currentSection != null)
|
||||||
@@ -56,18 +33,4 @@ public abstract class ServerChunkCache_profilerMixin
|
|||||||
CarpetProfiler.end_current_section(currentSection);
|
CarpetProfiler.end_current_section(currentSection);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//@Redirect(method = "tick", at = @At(
|
|
||||||
// value = "INVOKE",
|
|
||||||
// target = "Lnet/minecraft/server/level/DistanceManager;purgeStaleTickets()V"
|
|
||||||
//))
|
|
||||||
//private void pauseTicketSystem(DistanceManager distanceManager)
|
|
||||||
//{
|
|
||||||
// pausing expiry of tickets
|
|
||||||
// that will prevent also chunks from unloading, so require a deep frozen state
|
|
||||||
//ServerTickRateManager trm = ((MinecraftServerInterface) level.getServer()).getTickRateManager();
|
|
||||||
//if (!trm.runsNormally() && trm.deeplyFrozen()) return;
|
|
||||||
//distanceManager.purgeStaleTickets();
|
|
||||||
//}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,9 @@
|
|||||||
package carpet.mixins;
|
package carpet.mixins;
|
||||||
|
|
||||||
|
import carpet.fakes.EntityInterface;
|
||||||
import net.minecraft.network.protocol.game.ServerboundChatCommandPacket;
|
import net.minecraft.network.protocol.game.ServerboundChatCommandPacket;
|
||||||
|
import net.minecraft.world.entity.player.Input;
|
||||||
|
import net.minecraft.world.item.crafting.RecipeManager;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
@@ -51,12 +54,19 @@ public class ServerGamePacketListenerImpl_scarpetEventsMixin
|
|||||||
{
|
{
|
||||||
@Shadow public ServerPlayer player;
|
@Shadow public ServerPlayer player;
|
||||||
|
|
||||||
@Inject(method = "handlePlayerInput", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayer;setPlayerInput(FFZZ)V"))
|
@Inject(method = "handlePlayerInput", at = @At("HEAD"))
|
||||||
private void checkMoves(ServerboundPlayerInputPacket p, CallbackInfo ci)
|
private void checkMoves(ServerboundPlayerInputPacket p, CallbackInfo ci)
|
||||||
{
|
{
|
||||||
if (PLAYER_RIDES.isNeeded() && (p.getXxa() != 0.0F || p.getZza() != 0.0F || p.isJumping() || p.isShiftKeyDown()))
|
// todo this may not ride on the right thread moment, so needs to be checked
|
||||||
|
|
||||||
|
Input input = p.input();
|
||||||
|
|
||||||
|
if (player.getVehicle() != null && !((EntityInterface)player.getVehicle()).isPermanentVehicle()) // won't since that method makes sure its not null
|
||||||
|
player.setShiftKeyDown(p.input().shift());
|
||||||
|
|
||||||
|
if (PLAYER_RIDES.isNeeded() && (input.jump() || input.shift() || input.forward() || input.backward() || input.left() || input.right()))
|
||||||
{
|
{
|
||||||
PLAYER_RIDES.onMountControls(player, p.getXxa(), p.getZza(), p.isJumping(), p.isShiftKeyDown());
|
PLAYER_RIDES.onMountControls(player, input.left() == input.right() ? 0 : (input.left() ? -1 : 1 ), input.forward() == input.backward() ? 0 : (input.forward() ? 1 : -1), input.jump(), input.shift());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,24 +180,25 @@ public class ServerGamePacketListenerImpl_scarpetEventsMixin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "handlePlayerCommand", at = @At(
|
@Inject(method = "handlePlayerInput", at = @At(
|
||||||
value = "INVOKE",
|
value = "INVOKE",
|
||||||
target = "Lnet/minecraft/server/level/ServerPlayer;setShiftKeyDown(Z)V",
|
target = "Lnet/minecraft/server/level/ServerPlayer;setLastClientInput(Lnet/minecraft/world/entity/player/Input;)V"
|
||||||
ordinal = 0
|
|
||||||
))
|
))
|
||||||
private void onStartSneaking(ServerboundPlayerCommandPacket clientCommandC2SPacket_1, CallbackInfo ci)
|
private void onStartSneaking(ServerboundPlayerInputPacket serverboundPlayerInputPacket, CallbackInfo ci)
|
||||||
{
|
{
|
||||||
PLAYER_STARTS_SNEAKING.onPlayerEvent(player);
|
boolean wasDown = player.isShiftKeyDown();
|
||||||
}
|
boolean isDown = serverboundPlayerInputPacket.input().shift();
|
||||||
|
if (wasDown != isDown)
|
||||||
@Inject(method = "handlePlayerCommand", at = @At(
|
{
|
||||||
value = "INVOKE",
|
if (isDown)
|
||||||
target = "Lnet/minecraft/server/level/ServerPlayer;setShiftKeyDown(Z)V",
|
{
|
||||||
ordinal = 1
|
PLAYER_STARTS_SNEAKING.onPlayerEvent(player);
|
||||||
))
|
}
|
||||||
private void onStopSneaking(ServerboundPlayerCommandPacket clientCommandC2SPacket_1, CallbackInfo ci)
|
else
|
||||||
{
|
{
|
||||||
PLAYER_STOPS_SNEAKING.onPlayerEvent(player);
|
PLAYER_STOPS_SNEAKING.onPlayerEvent(player);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "handlePlayerCommand", at = @At(
|
@Inject(method = "handlePlayerCommand", at = @At(
|
||||||
@@ -246,7 +257,11 @@ public class ServerGamePacketListenerImpl_scarpetEventsMixin
|
|||||||
{
|
{
|
||||||
if (PLAYER_CHOOSES_RECIPE.isNeeded())
|
if (PLAYER_CHOOSES_RECIPE.isNeeded())
|
||||||
{
|
{
|
||||||
if(PLAYER_CHOOSES_RECIPE.onRecipeSelected(player, packet.getRecipe(), packet.isShiftDown())) ci.cancel();
|
RecipeManager.ServerDisplayInfo displayInfo = player.getServer().getRecipeManager().getRecipeFromDisplay(packet.recipe());
|
||||||
|
if (displayInfo == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(PLAYER_CHOOSES_RECIPE.onRecipeSelected(player, displayInfo.parent().id().location(), packet.useMaxItems())) ci.cancel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -255,7 +270,7 @@ public class ServerGamePacketListenerImpl_scarpetEventsMixin
|
|||||||
{
|
{
|
||||||
if (PLAYER_SWITCHES_SLOT.isNeeded() && player.getServer() != null && player.getServer().isSameThread())
|
if (PLAYER_SWITCHES_SLOT.isNeeded() && player.getServer() != null && player.getServer().isSameThread())
|
||||||
{
|
{
|
||||||
PLAYER_SWITCHES_SLOT.onSlotSwitch(player, player.getInventory().selected, packet.getSlot());
|
PLAYER_SWITCHES_SLOT.onSlotSwitch(player, player.getInventory().getSelectedSlot(), packet.getSlot());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ public class ServerGamePacketListenerimpl_connectionMixin
|
|||||||
// We should force onto the main thread here
|
// We should force onto the main thread here
|
||||||
// ServerNetworkHandler.handleData can possibly mutate data that isn't
|
// ServerNetworkHandler.handleData can possibly mutate data that isn't
|
||||||
// thread safe, and also allows for client commands to be executed
|
// thread safe, and also allows for client commands to be executed
|
||||||
PacketUtils.ensureRunningOnSameThread(serverboundCustomPayloadPacket, (ServerGamePacketListener) this, player.serverLevel());
|
PacketUtils.ensureRunningOnSameThread(serverboundCustomPayloadPacket, (ServerGamePacketListener) this, player.level());
|
||||||
ServerNetworkHandler.onClientData(player, cpp.data());
|
ServerNetworkHandler.onClientData(player, cpp.data());
|
||||||
ci.cancel();
|
ci.cancel();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import net.minecraft.world.level.entity.LevelEntityGetter;
|
|||||||
import net.minecraft.world.level.entity.PersistentEntitySectionManager;
|
import net.minecraft.world.level.entity.PersistentEntitySectionManager;
|
||||||
import net.minecraft.world.level.storage.ServerLevelData;
|
import net.minecraft.world.level.storage.ServerLevelData;
|
||||||
import net.minecraft.world.level.storage.WritableLevelData;
|
import net.minecraft.world.level.storage.WritableLevelData;
|
||||||
|
import net.minecraft.world.phys.Vec3;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
@@ -31,7 +32,6 @@ import org.spongepowered.asm.mixin.Unique;
|
|||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
|
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
|
||||||
|
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
@@ -43,18 +43,21 @@ import static carpet.script.CarpetEventServer.Event.CHUNK_UNLOADED;
|
|||||||
@Mixin(ServerLevel.class)
|
@Mixin(ServerLevel.class)
|
||||||
public abstract class ServerLevel_scarpetMixin extends Level implements ServerWorldInterface
|
public abstract class ServerLevel_scarpetMixin extends Level implements ServerWorldInterface
|
||||||
{
|
{
|
||||||
protected ServerLevel_scarpetMixin(WritableLevelData writableLevelData, ResourceKey<Level> resourceKey, RegistryAccess registryAccess, Holder<DimensionType> holder, Supplier<ProfilerFiller> supplier, boolean bl, boolean bl2, long l, int i)
|
|
||||||
|
@Shadow public abstract GameRules getGameRules();
|
||||||
|
|
||||||
|
protected ServerLevel_scarpetMixin(WritableLevelData writableLevelData, ResourceKey<Level> resourceKey, RegistryAccess registryAccess, Holder<DimensionType> holder, boolean bl, boolean bl2, long l, int i)
|
||||||
{
|
{
|
||||||
super(writableLevelData, resourceKey, registryAccess, holder, supplier, bl, bl2, l, i);
|
super(writableLevelData, resourceKey, registryAccess, holder, bl, bl2, l, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "tickChunk", locals = LocalCapture.CAPTURE_FAILHARD, at = @At(
|
@Inject(method = "tickThunder", locals = LocalCapture.CAPTURE_FAILHARD, at = @At(
|
||||||
value = "INVOKE",
|
value = "INVOKE",
|
||||||
target = "Lnet/minecraft/server/level/ServerLevel;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z",
|
target = "Lnet/minecraft/server/level/ServerLevel;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z",
|
||||||
shift = At.Shift.BEFORE,
|
shift = At.Shift.BEFORE,
|
||||||
ordinal = 1
|
ordinal = 1
|
||||||
))
|
))
|
||||||
private void onNaturalLightinig(LevelChunk chunk, int randomTickSpeed, CallbackInfo ci,
|
private void onNaturalLightinig(LevelChunk chunk, CallbackInfo ci,
|
||||||
//ChunkPos chunkPos, boolean bl, int i, int j, Profiler profiler, BlockPos blockPos, boolean bl2)
|
//ChunkPos chunkPos, boolean bl, int i, int j, Profiler profiler, BlockPos blockPos, boolean bl2)
|
||||||
ChunkPos chunkPos, boolean bl, int i, int j, ProfilerFiller profiler, BlockPos blockPos, DifficultyInstance localDifficulty, boolean bl2, LightningBolt lightningEntity)
|
ChunkPos chunkPos, boolean bl, int i, int j, ProfilerFiller profiler, BlockPos blockPos, DifficultyInstance localDifficulty, boolean bl2, LightningBolt lightningEntity)
|
||||||
{
|
{
|
||||||
@@ -65,8 +68,8 @@ public abstract class ServerLevel_scarpetMixin extends Level implements ServerWo
|
|||||||
return getGameRules().getBoolean(rule) ? Explosion.BlockInteraction.DESTROY_WITH_DECAY : Explosion.BlockInteraction.DESTROY;
|
return getGameRules().getBoolean(rule) ? Explosion.BlockInteraction.DESTROY_WITH_DECAY : Explosion.BlockInteraction.DESTROY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "explode", at = @At("HEAD"))
|
@Inject(method = "explode", at = @At("HEAD"), cancellable = true)
|
||||||
private void handleExplosion(/*@Nullable*/ Entity entity, /*@Nullable*/ DamageSource damageSource, /*@Nullable*/ ExplosionDamageCalculator explosionBehavior, double d, double e, double f, float g, boolean bl, ExplosionInteraction explosionInteraction, ParticleOptions particleOptions, ParticleOptions particleOptions2, Holder<SoundEvent> soundEvent, CallbackInfoReturnable<Explosion> cir)
|
private void handleExplosion(final Entity entity, final DamageSource damageSource, final ExplosionDamageCalculator explosionDamageCalculator, final double x, final double y, final double z, final float g, final boolean bl, final ExplosionInteraction explosionInteraction, final ParticleOptions particleOptions, final ParticleOptions particleOptions2, final Holder<SoundEvent> holder, final CallbackInfo ci)
|
||||||
{
|
{
|
||||||
if (EXPLOSION.isNeeded()) {
|
if (EXPLOSION.isNeeded()) {
|
||||||
Explosion.BlockInteraction var10000 = switch (explosionInteraction) {
|
Explosion.BlockInteraction var10000 = switch (explosionInteraction) {
|
||||||
@@ -74,10 +77,11 @@ public abstract class ServerLevel_scarpetMixin extends Level implements ServerWo
|
|||||||
case BLOCK -> this.getCMDestroyType(GameRules.RULE_BLOCK_EXPLOSION_DROP_DECAY);
|
case BLOCK -> this.getCMDestroyType(GameRules.RULE_BLOCK_EXPLOSION_DROP_DECAY);
|
||||||
case MOB -> this.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? this.getCMDestroyType(GameRules.RULE_MOB_EXPLOSION_DROP_DECAY) : Explosion.BlockInteraction.KEEP;
|
case MOB -> this.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? this.getCMDestroyType(GameRules.RULE_MOB_EXPLOSION_DROP_DECAY) : Explosion.BlockInteraction.KEEP;
|
||||||
case TNT -> this.getCMDestroyType(GameRules.RULE_TNT_EXPLOSION_DROP_DECAY);
|
case TNT -> this.getCMDestroyType(GameRules.RULE_TNT_EXPLOSION_DROP_DECAY);
|
||||||
default -> throw new IncompatibleClassChangeError();
|
case TRIGGER -> Explosion.BlockInteraction.TRIGGER_BLOCK;
|
||||||
};
|
};
|
||||||
|
|
||||||
EXPLOSION.onExplosion((ServerLevel) (Object) this, entity, null, d, e, f, g, bl, null, null, var10000);
|
boolean cancelled = EXPLOSION.onExplosion((ServerLevel) (Object) this, entity, null, new Vec3(x, y, z), g, bl, null, null, var10000);
|
||||||
|
if (cancelled) ci.cancel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,9 +21,9 @@ import net.minecraft.world.level.storage.WritableLevelData;
|
|||||||
@Mixin(ServerLevel.class)
|
@Mixin(ServerLevel.class)
|
||||||
public abstract class ServerLevel_tickMixin extends Level implements LevelInterface
|
public abstract class ServerLevel_tickMixin extends Level implements LevelInterface
|
||||||
{
|
{
|
||||||
protected ServerLevel_tickMixin(final WritableLevelData writableLevelData, final ResourceKey<Level> resourceKey, final RegistryAccess registryAccess, final Holder<DimensionType> holder, final Supplier<ProfilerFiller> supplier, final boolean bl, final boolean bl2, final long l, final int i)
|
protected ServerLevel_tickMixin(final WritableLevelData writableLevelData, final ResourceKey<Level> resourceKey, final RegistryAccess registryAccess, final Holder<DimensionType> holder, final boolean bl, final boolean bl2, final long l, final int i)
|
||||||
{
|
{
|
||||||
super(writableLevelData, resourceKey, registryAccess, holder, supplier, bl, bl2, l, i);
|
super(writableLevelData, resourceKey, registryAccess, holder, bl, bl2, l, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
private CarpetProfiler.ProfilerToken currentSection;
|
private CarpetProfiler.ProfilerToken currentSection;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package carpet.mixins;
|
|||||||
import carpet.helpers.BlockRotator;
|
import carpet.helpers.BlockRotator;
|
||||||
import net.minecraft.server.level.ServerPlayerGameMode;
|
import net.minecraft.server.level.ServerPlayerGameMode;
|
||||||
import net.minecraft.world.InteractionHand;
|
import net.minecraft.world.InteractionHand;
|
||||||
import net.minecraft.world.ItemInteractionResult;
|
import net.minecraft.world.InteractionResult;
|
||||||
import net.minecraft.world.entity.player.Player;
|
import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
@@ -19,13 +19,13 @@ public class ServerPlayerGameMode_cactusMixin
|
|||||||
|
|
||||||
@Redirect(method = "useItemOn", at = @At(
|
@Redirect(method = "useItemOn", at = @At(
|
||||||
value = "INVOKE",
|
value = "INVOKE",
|
||||||
target = "Lnet/minecraft/world/level/block/state/BlockState;useItemOn(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/InteractionHand;Lnet/minecraft/world/phys/BlockHitResult;)Lnet/minecraft/world/ItemInteractionResult;"
|
target = "Lnet/minecraft/world/level/block/state/BlockState;useItemOn(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/InteractionHand;Lnet/minecraft/world/phys/BlockHitResult;)Lnet/minecraft/world/InteractionResult;"
|
||||||
))
|
))
|
||||||
private ItemInteractionResult activateWithOptionalCactus(final BlockState blockState, final ItemStack itemStack, final Level world_1, final Player playerEntity_1, final InteractionHand hand_1, final BlockHitResult blockHitResult_1)
|
private InteractionResult activateWithOptionalCactus(final BlockState blockState, final ItemStack itemStack, final Level world_1, final Player playerEntity_1, final InteractionHand hand_1, final BlockHitResult blockHitResult_1)
|
||||||
{
|
{
|
||||||
boolean flipped = BlockRotator.flipBlockWithCactus(blockState, world_1, playerEntity_1, hand_1, blockHitResult_1);
|
boolean flipped = BlockRotator.flipBlockWithCactus(blockState, world_1, playerEntity_1, hand_1, blockHitResult_1);
|
||||||
if (flipped)
|
if (flipped)
|
||||||
return ItemInteractionResult.SUCCESS;
|
return InteractionResult.SUCCESS;
|
||||||
|
|
||||||
return blockState.useItemOn(itemStack, world_1, playerEntity_1, hand_1, blockHitResult_1);
|
return blockState.useItemOn(itemStack, world_1, playerEntity_1, hand_1, blockHitResult_1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import net.minecraft.world.damagesource.DamageSource;
|
|||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import net.minecraft.world.entity.player.Player;
|
import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.portal.DimensionTransition;
|
import net.minecraft.world.level.portal.TeleportTransition;
|
||||||
import net.minecraft.world.phys.Vec3;
|
import net.minecraft.world.phys.Vec3;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
@@ -38,8 +38,8 @@ public abstract class ServerPlayer_scarpetEventMixin extends Player implements S
|
|||||||
@Unique
|
@Unique
|
||||||
private boolean isInvalidReference = false;
|
private boolean isInvalidReference = false;
|
||||||
|
|
||||||
public ServerPlayer_scarpetEventMixin(Level level, BlockPos blockPos, float f, GameProfile gameProfile) {
|
public ServerPlayer_scarpetEventMixin(Level level, GameProfile gameProfile) {
|
||||||
super(level, blockPos, f, gameProfile);
|
super(level, gameProfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
//@Shadow protected abstract void completeUsingItem();
|
//@Shadow protected abstract void completeUsingItem();
|
||||||
@@ -83,33 +83,23 @@ public abstract class ServerPlayer_scarpetEventMixin extends Player implements S
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Redirect(method = "setPlayerInput", at = @At(
|
|
||||||
value = "INVOKE",
|
|
||||||
target = "Lnet/minecraft/server/level/ServerPlayer;setShiftKeyDown(Z)V"
|
|
||||||
))
|
|
||||||
private void setSneakingConditionally(ServerPlayer serverPlayerEntity, boolean sneaking)
|
|
||||||
{
|
|
||||||
if (!((EntityInterface)serverPlayerEntity.getVehicle()).isPermanentVehicle()) // won't since that method makes sure its not null
|
|
||||||
serverPlayerEntity.setShiftKeyDown(sneaking);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Vec3 previousLocation;
|
private Vec3 previousLocation;
|
||||||
private ResourceKey<Level> previousDimension;
|
private ResourceKey<Level> previousDimension;
|
||||||
|
|
||||||
@Inject(method = "changeDimension", at = @At("HEAD"))
|
@Inject(method = "teleport", at = @At("HEAD"))
|
||||||
private void logPreviousCoordinates(DimensionTransition serverWorld, CallbackInfoReturnable<Entity> cir)
|
private void logPreviousCoordinates(TeleportTransition serverWorld, CallbackInfoReturnable<Entity> cir)
|
||||||
{
|
{
|
||||||
previousLocation = position();
|
previousLocation = position();
|
||||||
previousDimension = level().dimension(); //dimension type
|
previousDimension = level().dimension(); //dimension type
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "changeDimension", at = @At("RETURN"))
|
@Inject(method = "teleport", at = @At("RETURN"))
|
||||||
private void atChangeDimension(DimensionTransition destinationP, CallbackInfoReturnable<Entity> cir)
|
private void atChangeDimension(TeleportTransition destinationP, CallbackInfoReturnable<Entity> cir)
|
||||||
{
|
{
|
||||||
if (PLAYER_CHANGES_DIMENSION.isNeeded())
|
if (PLAYER_CHANGES_DIMENSION.isNeeded())
|
||||||
{
|
{
|
||||||
ServerPlayer player = (ServerPlayer) (Object)this;
|
ServerPlayer player = (ServerPlayer) (Object)this;
|
||||||
DimensionTransition destinationTransition = destinationP;
|
TeleportTransition destinationTransition = destinationP;
|
||||||
ServerLevel destination = destinationTransition.newLevel();
|
ServerLevel destination = destinationTransition.newLevel();
|
||||||
Vec3 to = null;
|
Vec3 to = null;
|
||||||
if (!wonGame || previousDimension != Level.END || destination.dimension() != Level.OVERWORLD)
|
if (!wonGame || previousDimension != Level.END || destination.dimension() != Level.OVERWORLD)
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import net.minecraft.core.BlockPos;
|
|||||||
import net.minecraft.server.commands.SetBlockCommand;
|
import net.minecraft.server.commands.SetBlockCommand;
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.world.level.block.Block;
|
import net.minecraft.world.level.block.Block;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
@@ -14,10 +15,10 @@ public class SetBlockCommand_fillUpdatesMixin
|
|||||||
{
|
{
|
||||||
@Redirect(method = "setBlock", at = @At(
|
@Redirect(method = "setBlock", at = @At(
|
||||||
value = "INVOKE",
|
value = "INVOKE",
|
||||||
target = "Lnet/minecraft/server/level/ServerLevel;blockUpdated(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/Block;)V"
|
target = "Lnet/minecraft/server/level/ServerLevel;updateNeighboursOnBlockSet(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)V"
|
||||||
))
|
))
|
||||||
private static void conditionalUpdating(ServerLevel serverWorld, BlockPos blockPos_1, Block block_1)
|
private static void conditionalUpdating(ServerLevel serverWorld, BlockPos blockPos_1, BlockState block_1)
|
||||||
{
|
{
|
||||||
if (CarpetSettings.fillUpdates) serverWorld.blockUpdated(blockPos_1, block_1);
|
if (CarpetSettings.fillUpdates) serverWorld.updateNeighboursOnBlockSet(blockPos_1, block_1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,11 +1,6 @@
|
|||||||
package carpet.mixins;
|
package carpet.mixins;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
|
||||||
|
|
||||||
import net.minecraft.client.model.ShulkerModel;
|
|
||||||
|
|
||||||
@Mixin(net.minecraft.client.renderer.blockentity.ShulkerBoxRenderer.class)
|
@Mixin(net.minecraft.client.renderer.blockentity.ShulkerBoxRenderer.class)
|
||||||
public interface ShulkerBoxAccessMixin {
|
public interface ShulkerBoxAccessMixin {
|
||||||
@Accessor("model")
|
|
||||||
ShulkerModel getModel();
|
|
||||||
}
|
}
|
||||||
@@ -9,6 +9,9 @@ import org.spongepowered.asm.mixin.injection.Constant;
|
|||||||
import org.spongepowered.asm.mixin.injection.ModifyArg;
|
import org.spongepowered.asm.mixin.injection.ModifyArg;
|
||||||
import org.spongepowered.asm.mixin.injection.ModifyConstant;
|
import org.spongepowered.asm.mixin.injection.ModifyConstant;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
@Mixin(StructureBlockEntity.class)
|
@Mixin(StructureBlockEntity.class)
|
||||||
public abstract class StructureBlockEntity_limitsMixin
|
public abstract class StructureBlockEntity_limitsMixin
|
||||||
{
|
{
|
||||||
@@ -29,14 +32,16 @@ public abstract class StructureBlockEntity_limitsMixin
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ModifyArg(
|
@ModifyArg(
|
||||||
method = "saveStructure(Z)Z",
|
method = "saveStructure(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/core/BlockPos;Lnet/minecraft/core/Vec3i;ZLjava/lang/String;ZLjava/util/List;)Z",
|
||||||
at = @At(
|
at = @At(
|
||||||
value = "INVOKE",
|
value = "INVOKE",
|
||||||
target = "Lnet/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate;fillFromWorld(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/core/Vec3i;ZLnet/minecraft/world/level/block/Block;)V"
|
target = "Lnet/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate;fillFromWorld(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/core/Vec3i;ZLjava/util/List;)V"
|
||||||
),
|
),
|
||||||
index = 4
|
index = 4
|
||||||
)
|
)
|
||||||
private Block ignoredBlock(Block original) {
|
private static List<Block> ignoredBlock(List<Block> original) {
|
||||||
return CarpetSettings.structureBlockIgnoredBlock;
|
if (original.contains(CarpetSettings.structureBlockIgnoredBlock))
|
||||||
|
return original;
|
||||||
|
return Stream.concat(original.stream(), Stream.of(CarpetSettings.structureBlockIgnoredBlock)).toList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,14 +2,14 @@ package carpet.mixins;
|
|||||||
|
|
||||||
import carpet.CarpetSettings;
|
import carpet.CarpetSettings;
|
||||||
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
|
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
|
||||||
import net.minecraft.client.renderer.blockentity.StructureBlockRenderer;
|
import net.minecraft.client.renderer.blockentity.BlockEntityWithBoundingBoxRenderer;
|
||||||
import net.minecraft.world.level.block.entity.StructureBlockEntity;
|
import net.minecraft.world.level.block.entity.StructureBlockEntity;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
@Mixin(StructureBlockRenderer.class)
|
@Mixin(BlockEntityWithBoundingBoxRenderer.class)
|
||||||
public abstract class StructureBlockRenderer_mixin implements BlockEntityRenderer<StructureBlockEntity>
|
public abstract class StructureBlockRenderer_mixin implements BlockEntityRenderer<StructureBlockEntity>
|
||||||
{
|
{
|
||||||
@Inject(method = "getViewDistance", at = @At("HEAD"), cancellable = true)
|
@Inject(method = "getViewDistance", at = @At("HEAD"), cancellable = true)
|
||||||
|
|||||||
@@ -15,12 +15,12 @@ public class StructureTemplate_fillUpdatesMixin
|
|||||||
{
|
{
|
||||||
@Redirect( method = "placeInWorld", at = @At(
|
@Redirect( method = "placeInWorld", at = @At(
|
||||||
value = "INVOKE",
|
value = "INVOKE",
|
||||||
target = "Lnet/minecraft/world/level/ServerLevelAccessor;blockUpdated(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/Block;)V"
|
target = "Lnet/minecraft/world/level/ServerLevelAccessor;updateNeighborsAt(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/Block;)V"
|
||||||
))
|
))
|
||||||
private void skipUpdateNeighbours(ServerLevelAccessor serverWorldAccess, BlockPos pos, Block block)
|
private void skipUpdateNeighbours(ServerLevelAccessor serverWorldAccess, BlockPos pos, Block block)
|
||||||
{
|
{
|
||||||
if (!CarpetSettings.impendingFillSkipUpdates.get())
|
if (!CarpetSettings.impendingFillSkipUpdates.get())
|
||||||
serverWorldAccess.blockUpdated(pos, block);
|
serverWorldAccess.updateNeighborsAt(pos, block);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Redirect(method = "placeInWorld", at = @At(
|
@Redirect(method = "placeInWorld", at = @At(
|
||||||
|
|||||||
Loaded 100 of 172 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user