Compare commits
42 Commits
readme-twe
...
1.20
| Author | SHA1 | Date | |
|---|---|---|---|
| 470b5839a4 | |||
|
|
594c4decf3 | ||
|
|
ecb0dcee56 | ||
|
|
cc18c6f793 | ||
|
|
6e712fc8da | ||
|
|
06e722cb7c | ||
|
|
2ffe983e12 | ||
|
|
5462ec7e93 | ||
|
|
a603bdc8df | ||
|
|
21ffc08fcf | ||
|
|
cc0803de11 | ||
|
|
7e7133e08c | ||
|
|
2e30446281 | ||
|
|
9452482254 | ||
|
|
91557161e0 | ||
|
|
85b076d638 | ||
|
|
5292e97a8f | ||
|
|
f843376f7a | ||
|
|
84d475d61c | ||
|
|
f3f3cff079 | ||
|
|
fe81c18b5b | ||
|
|
ec904c199e | ||
|
|
281eb51c0d | ||
|
|
3d2f786049 | ||
|
|
3ca9f6ceb1 | ||
|
|
92bd6924b0 | ||
|
|
639fdefcce | ||
|
|
1de20710fe | ||
|
|
5b37a39dbc | ||
|
|
0bc5b3b67d | ||
|
|
dbd8fba683 | ||
|
|
d6da33da63 | ||
|
|
2969470796 | ||
|
|
074cedc85c | ||
|
|
a4b4162fa9 | ||
|
|
a2f81aeeac | ||
|
|
c2d6f01991 | ||
|
|
a9d9dcfecf | ||
|
|
96d7c92c37 | ||
|
|
6869461124 | ||
|
|
66212d2d16 | ||
|
|
aa8c545089 |
22
LICENSE
22
LICENSE
|
|
@ -1 +1,21 @@
|
|||
This mod and its source code is now in public domain. Feel free to do whatever you want with it; make forks, distribute it... whatever I would appreciate it, of course, if you credited me 😊 Thank you!
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2023 CinemaMod Group
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
|
|
|||
31
README.md
31
README.md
|
|
@ -1,10 +1,25 @@
|
|||
# CinemaMod WebDisplays
|
||||
This is a fork of the WebDisplays mod from 1.12, updated to work in newer versions, and with some bug fixes and reworking.
|
||||
|
||||
Cinemamod WebDisplays also uses CinemaMod's [MCEF](https://github.com/CinemaMod/mcef) and [JCEF](https://github.com/CinemaMod/java-cef), which should allow for WD to be a bit more seamless than [Chromium's JCEF](https://github.com/chromiumembedded/java-cef) would allow for.
|
||||
|
||||
# WebDisplays
|
||||
WebDisplays adds a screen block, which allows you to browse the internet in minecraft.
|
||||
WebDisplays is a mod for creating and interacting with web browsers in Minecraft. You can create screens in your world and browse the internet.
|
||||
|
||||
### Wiki
|
||||
* A Wiki which details all blocks/items can be found on [montoyo's website](https://montoyo.net/wdwiki/). However, a lot of stuff has changed since that wiki was written.
|
||||
WebDisplays was originally written by montoyo. It is currently maintained by CinemaMod Group.
|
||||
|
||||
Discussion: https://discord.gg/rNrh5kW8Ty
|
||||
|
||||
## Install
|
||||
Download WebDisplays from either:
|
||||
- CurseForge: https://legacy.curseforge.com/minecraft/mc-mods/webdisplays
|
||||
- Modrinth: https://modrinth.com/mod/webdisplays
|
||||
|
||||
**WebDisplays Requires MCEF!** You must install MCEF in order for WebDisplays to work.
|
||||
|
||||
Download MCEF from either:
|
||||
- CurseForge: https://legacy.curseforge.com/minecraft/mc-mods/mcef
|
||||
- Modrinth: https://modrinth.com/mod/mcef
|
||||
|
||||
<img src='https://github.com/CinemaMod/webdisplays/assets/30220598/2acfd365-fa87-4adb-970a-33bb5c79f7ba' width='500'>
|
||||
<img src='https://github.com/CinemaMod/webdisplays/assets/30220598/4e9985a3-d09f-4ab4-8016-37733d4f4a99' width='500'>
|
||||
|
||||
## Wiki
|
||||
[Outdated Wiki from the original creator](https://montoyo.net/wdwiki/index.php?title=Main_Page)
|
||||
|
||||
[Outdated Getting Started](https://montoyo.net/wdwiki/index.php?title=Screen)
|
||||
|
|
|
|||
230
build.gradle
230
build.gradle
|
|
@ -1,137 +1,179 @@
|
|||
plugins {
|
||||
id 'eclipse'
|
||||
id 'java'
|
||||
id 'idea'
|
||||
id 'maven-publish'
|
||||
id 'net.neoforged.gradle' version '[6.0.18,6.2)'
|
||||
id 'org.spongepowered.mixin' version '0.7.+'
|
||||
id 'org.parchmentmc.librarian.forgegradle' version '1.+'
|
||||
id 'com.github.johnrengelman.shadow' version '8.1.1'
|
||||
id 'net.neoforged.moddev.legacyforge' version '2.0.103'
|
||||
}
|
||||
|
||||
version = mod_version
|
||||
group = maven_group // http://maven.apache.org/guides/mini/guide-naming-conventions.html
|
||||
archivesBaseName = archives_base_name
|
||||
// Only add ProGuard if building with it
|
||||
def enableProguard = project.hasProperty("enableProguard") && project.enableProguard.toBoolean()
|
||||
if (enableProguard) {
|
||||
buildscript {
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.guardsquare:proguard-gradle:7.7.0'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
base {
|
||||
archivesName = mod_id
|
||||
}
|
||||
|
||||
group = mod_group_id
|
||||
version = "${minecraft_version}-${mod_version}"
|
||||
|
||||
java.toolchain.languageVersion = JavaLanguageVersion.of(17)
|
||||
|
||||
println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + '(' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch'))
|
||||
minecraft {
|
||||
mappings channel: 'parchment', version: '2023.06.26-1.20.1'
|
||||
println "Java: ${System.getProperty 'java.version'}"
|
||||
|
||||
accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg')
|
||||
repositories {
|
||||
mavenCentral()
|
||||
maven { url = "https://libraries.minecraft.net/" }
|
||||
maven { url = "https://cursemaven.com" }
|
||||
maven { url = "https://maven.parchmentmc.org" }
|
||||
maven { url = 'https://mcef-download.cinemamod.com/repositories/releases/' }
|
||||
maven { url = "https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/" }
|
||||
maven { url = "https://maven.theillusivec4.top/" }
|
||||
maven { url = "https://repo.lucko.me/" }
|
||||
maven { url = "https://maven.kosmx.dev/" }
|
||||
maven { url = "https://modmaven.dev" }
|
||||
flatDir { dir "libs" }
|
||||
}
|
||||
|
||||
legacyForge {
|
||||
version = "${minecraft_version}-${forge_version}"
|
||||
|
||||
// Access transformer
|
||||
accessTransformers = files("src/main/resources/META-INF/accesstransformer.cfg")
|
||||
|
||||
// Parchment mappings
|
||||
parchment {
|
||||
minecraftVersion = minecraft_version
|
||||
mappingsVersion = mapping_lasting_version
|
||||
}
|
||||
|
||||
copyIdeResources = true
|
||||
runs {
|
||||
client {
|
||||
properties 'mixin.env.remapRefMap': 'true'
|
||||
property 'mixin.env.refMapRemappingFile', "${project.projectDir}/build/createSrgToMcp/output.srg"
|
||||
workingDirectory project.file('run')
|
||||
arg "-mixin.config=webdisplays.mixins.json"
|
||||
property 'forge.logging.console.level', 'debug'
|
||||
configureEach {
|
||||
systemProperty 'forge.logging.console.level', 'debug'
|
||||
logLevel = org.slf4j.event.Level.DEBUG
|
||||
}
|
||||
|
||||
mods {
|
||||
webdisplays {
|
||||
source sourceSets.main
|
||||
}
|
||||
}
|
||||
client {
|
||||
client()
|
||||
programArgument "-mixin.config=${mod_id}.mixins.json"
|
||||
systemProperty 'mixin.debug.export', 'true'
|
||||
}
|
||||
|
||||
server {
|
||||
properties 'mixin.env.remapRefMap': 'true'
|
||||
property 'mixin.env.refMapRemappingFile', "${project.projectDir}/build/createSrgToMcp/output.srg"
|
||||
workingDirectory project.file('run')
|
||||
arg "-mixin.config=webdisplays.mixins.json"
|
||||
|
||||
|
||||
property 'forge.logging.console.level', 'debug'
|
||||
|
||||
mods {
|
||||
webdisplays {
|
||||
source sourceSets.main
|
||||
}
|
||||
}
|
||||
server()
|
||||
programArgument "-mixin.config=${mod_id}.mixins.json"
|
||||
}
|
||||
|
||||
data {
|
||||
workingDirectory project.file('run')
|
||||
properties 'mixin.env.remapRefMap': 'true'
|
||||
property 'mixin.env.refMapRemappingFile', "${project.projectDir}/build/createSrgToMcp/output.srg"
|
||||
property 'forge.logging.console.level', 'debug'
|
||||
args '--mod', 'webdisplays', '--all', '--output', file('src/generated/resources/'), '--existing', sourceSets.main.resources.srcDirs[0]
|
||||
mods {
|
||||
webdisplays {
|
||||
source sourceSets.main
|
||||
}
|
||||
}
|
||||
data()
|
||||
programArguments.addAll '--mod', mod_id, '--all',
|
||||
'--output', file('src/generated/resources/').absolutePath,
|
||||
'--existing', file('src/main/resources/').absolutePath
|
||||
}
|
||||
}
|
||||
|
||||
mods {
|
||||
"${mod_id}" {
|
||||
sourceSet sourceSets.main
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
repositories{
|
||||
maven { url "https://maven.shedaniel.me/" }
|
||||
maven { url 'https://jitpack.io' }
|
||||
maven {
|
||||
name = "cursemaven"
|
||||
url = "https://www.cursemaven.com"
|
||||
}
|
||||
flatDir { dirs 'libs' }
|
||||
maven { url 'https://mcef-download.cinemamod.com/repository/releases' }
|
||||
maven { url = uri('https://mcef-download.cinemamod.com/repositories/releases') }
|
||||
sourceSets.main.resources {
|
||||
srcDir 'src/generated/resources'
|
||||
}
|
||||
|
||||
dependencies {
|
||||
minecraft 'net.neoforged:forge:1.20.1-47.1.65'
|
||||
annotationProcessor 'org.spongepowered:mixin:0.8.5:processor'
|
||||
|
||||
// implementation fg.deobf("curse.maven:spark-361579:4381167")
|
||||
compileOnly fg.deobf("curse.maven:vivecraft-667903:4794431")
|
||||
|
||||
implementation fg.deobf("com.cinemamod:mcef-forge:2.0.1-1.20.1") {
|
||||
// MCEF dependency
|
||||
modImplementation("com.cinemamod:mcef-forge:2.1.1-1.20.1") {
|
||||
transitive = false
|
||||
}
|
||||
|
||||
// Optional mods (make sure versions exist)
|
||||
modRuntimeOnly "curse.maven:spark-361579:4738952"
|
||||
modCompileOnly "curse.maven:vivecraft-667903:4794431"
|
||||
modImplementation "software.bernie.geckolib:geckolib-forge-${minecraft_version}:${geckolib_version}"
|
||||
modCompileOnly "top.theillusivec4.curios:curios-forge:${curios_version}:api"
|
||||
modRuntimeOnly "top.theillusivec4.curios:curios-forge:${curios_version}"
|
||||
|
||||
// Mixin Extras
|
||||
compileOnly annotationProcessor("io.github.llamalad7:mixinextras-common:0.4.1")
|
||||
modImplementation "io.github.llamalad7:mixinextras-forge:0.4.1"
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
main.resources.srcDirs += 'src/generated/resources'
|
||||
}
|
||||
|
||||
// Example for how to get properties into the manifest for reading by the runtime..
|
||||
jar {
|
||||
tasks.named('jar', Jar) {
|
||||
manifest {
|
||||
attributes([
|
||||
"Specification-Title": "webdisplays",
|
||||
"Specification-Vendor": "webdisplays",
|
||||
"Specification-Version": "1", // We are version 1 of ourselves
|
||||
"Implementation-Title": project.name,
|
||||
"Implementation-Version": "${version}",
|
||||
"Implementation-Vendor" :"webdisplays",
|
||||
"Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"),
|
||||
"MixinConfigs": "webdisplays.mixins.json"
|
||||
'Specification-Title': mod_name,
|
||||
'Specification-Vendor': mod_authors,
|
||||
'Specification-Version': '1',
|
||||
'Implementation-Title': project.name,
|
||||
'Implementation-Version': project.version,
|
||||
'Implementation-Vendor': mod_authors,
|
||||
'MixinConfigs': "${mod_id}.mixins.json"
|
||||
])
|
||||
}
|
||||
|
||||
// Exclude ProGuard renamed files if ProGuard is used
|
||||
if (enableProguard) {
|
||||
exclude 'META-INF/versions/**'
|
||||
}
|
||||
}
|
||||
|
||||
// Example configuration to allow publishing using the maven-publish task
|
||||
// we define a custom artifact that is sourced from the reobfJar output task
|
||||
// and then declare that to be published
|
||||
// Note you'll need to add a repository here
|
||||
def reobfFile = file("$buildDir/reobfJar/output.jar")
|
||||
def reobfArtifact = artifacts.add('default', reobfFile) {
|
||||
type 'jar'
|
||||
builtBy 'reobfJar'
|
||||
// Generate sources jar
|
||||
tasks.register('sourcesJar', Jar) {
|
||||
dependsOn classes
|
||||
archiveClassifier = 'sources'
|
||||
from sourceSets.main.allSource
|
||||
}
|
||||
|
||||
// Reobfuscation handling
|
||||
tasks.named('reobfJar') {
|
||||
if (enableProguard) {
|
||||
dependsOn 'proguard'
|
||||
input = file("${buildDir}/libs/${mod_id}-${minecraft_version}-${mod_version}-proguard.jar")
|
||||
} else {
|
||||
dependsOn 'jar'
|
||||
input = tasks.jar.archiveFile.get().asFile
|
||||
}
|
||||
}
|
||||
|
||||
// ProGuard configuration (if enabled)
|
||||
if (enableProguard) {
|
||||
tasks.register('proguard', proguard.gradle.ProGuardTask) {
|
||||
dependsOn tasks.jar
|
||||
configuration 'proguard.pro'
|
||||
|
||||
libraryjars "${System.getProperty('java.home')}/jmods"
|
||||
|
||||
def inputJar = tasks.jar.archiveFile.get().asFile
|
||||
injars inputJar
|
||||
outjars "${buildDir}/libs/${mod_id}-${minecraft_version}-${mod_version}-proguard.jar"
|
||||
}
|
||||
}
|
||||
|
||||
publishing {
|
||||
publications {
|
||||
mavenJava(MavenPublication) {
|
||||
artifact reobfArtifact
|
||||
artifactId = mod_id
|
||||
artifact reobfJar
|
||||
artifact sourcesJar
|
||||
}
|
||||
}
|
||||
|
||||
repositories {
|
||||
maven {
|
||||
url "file:///${project.projectDir}/mcmodsrepo"
|
||||
name = "local"
|
||||
url = layout.buildDirectory.dir("repo")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
apply plugin: 'org.spongepowered.mixin'
|
||||
|
||||
mixin {
|
||||
add sourceSets.main, "webdisplays.refmap.json"
|
||||
}
|
||||
}
|
||||
|
|
@ -1,17 +1,36 @@
|
|||
# Done to increase the memory available to gradle.
|
||||
# Gradle settings
|
||||
org.gradle.jvmargs=-Xmx3G
|
||||
loom.platform=forge
|
||||
org.gradle.daemon=false
|
||||
org.gradle.parallel=true
|
||||
org.gradle.caching=true
|
||||
|
||||
# Fabric Properties
|
||||
# check these on https://fabricmc.net/develop
|
||||
minecraft_version=1.19.2
|
||||
yarn_mappings=1.19.2+build.28
|
||||
loader_version=0.14.14
|
||||
# ProGuard
|
||||
enableProguard=false
|
||||
|
||||
# Mod Properties
|
||||
mod_version = 1.3.3
|
||||
maven_group = net.montoyo.wd
|
||||
archives_base_name = webdisplays
|
||||
# Mod properties
|
||||
mod_id=webdisplays
|
||||
mod_name=WebDisplays
|
||||
mod_version=2.0.3
|
||||
mod_group_id=com.cinemamod
|
||||
mod_authors=CinemaMod Group
|
||||
mod_description=Web browser displays for Minecraft
|
||||
mod_license=All Rights Reserved
|
||||
mod_credits=CinemaMod Group
|
||||
|
||||
# Dependencies
|
||||
forge_version=1.19.2-43.2.6
|
||||
# Minecraft/Forge versions
|
||||
minecraft_version=1.20.1
|
||||
forge_version=47.3.4
|
||||
minecraft_version_range=[1.20.1,1.21)
|
||||
forge_version_range=[47,)
|
||||
loader_version_range=[47,)
|
||||
|
||||
# Parchment mappings
|
||||
mapping_channel=parchment
|
||||
mapping_version=2023.09.03-1.20.1
|
||||
mapping_lasting_version=2023.09.03
|
||||
|
||||
# Other mod versions
|
||||
jei_version=15.20.0.112
|
||||
player_anim_version=1.0.2-rc1+1.20
|
||||
geckolib_version=4.2.1
|
||||
curios_version=5.5.0+1.20.1
|
||||
Binary file not shown.
|
|
@ -1,28 +1,11 @@
|
|||
pluginManagement {
|
||||
repositories {
|
||||
mavenLocal()
|
||||
gradlePluginPortal()
|
||||
maven {
|
||||
name = 'NeoForged'
|
||||
url = 'https://maven.neoforged.net/releases'
|
||||
}
|
||||
maven { url = 'https://maven.neoforged.net/releases' }
|
||||
maven { url = 'https://maven.parchmentmc.org' } // Add this line
|
||||
}
|
||||
// resolutionStrategy {
|
||||
// eachPlugin {
|
||||
// switch (requested.id.toString()) {
|
||||
// case "net.minecraftforge.gradle": {
|
||||
// useModule("${requested.id}:ForgeGradle:${requested.version}")
|
||||
// break
|
||||
// }
|
||||
// case "org.spongepowered.mixin": {
|
||||
// useModule("org.spongepowered:mixingradle:${requested.version}")
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
plugins {
|
||||
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.5.0'
|
||||
}
|
||||
id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0'
|
||||
}
|
||||
|
|
@ -14,14 +14,21 @@ import net.minecraft.world.entity.player.Player;
|
|||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.level.BlockGetter;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import net.minecraftforge.network.NetworkEvent;
|
||||
import net.minecraftforge.server.ServerLifecycleHooks;
|
||||
import net.montoyo.wd.core.HasAdvancement;
|
||||
import net.montoyo.wd.core.JSServerRequest;
|
||||
import net.montoyo.wd.data.GuiData;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.entity.ScreenData;
|
||||
import net.montoyo.wd.utilities.*;
|
||||
import net.montoyo.wd.utilities.math.Vector2i;
|
||||
import net.montoyo.wd.utilities.math.Vector3i;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.data.Rotation;
|
||||
import net.montoyo.wd.utilities.serialization.NameUUIDPair;
|
||||
import org.joml.Vector3d;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.UUID;
|
||||
|
|
@ -37,7 +44,7 @@ public class SharedProxy {
|
|||
public void postInit() {
|
||||
}
|
||||
|
||||
public void onCefInit(/*CefInitEvent event*/) {
|
||||
public void onCefInit() {
|
||||
}
|
||||
|
||||
@Deprecated(forRemoval = true)
|
||||
|
|
@ -58,7 +65,7 @@ public class SharedProxy {
|
|||
Log.error("Called SharedProxy.displayGui() on server side...");
|
||||
}
|
||||
|
||||
public void trackScreen(TileEntityScreen tes, boolean track) {
|
||||
public void trackScreen(ScreenBlockEntity tes, boolean track) {
|
||||
}
|
||||
|
||||
public void onAutocompleteResult(NameUUIDPair pairs[]) {
|
||||
|
|
@ -121,4 +128,21 @@ public class SharedProxy {
|
|||
public boolean isShiftDown() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public double distanceTo(ScreenBlockEntity tes, Vec3 position) {
|
||||
double dist = Double.POSITIVE_INFINITY;
|
||||
for (int i = 0; i < tes.screenCount(); i++) {
|
||||
ScreenData scrn = tes.getScreen(i);
|
||||
|
||||
Vector3d pos = new Vector3d(
|
||||
scrn.side.right.x * scrn.size.x / 2d + scrn.size.y * scrn.side.up.x / 2d,
|
||||
scrn.side.right.y * scrn.size.x / 2d + scrn.size.y * scrn.side.up.y / 2d,
|
||||
scrn.side.right.z * scrn.size.x / 2d + scrn.size.y * scrn.side.up.z / 2d
|
||||
).add(tes.getBlockPos().getX(), tes.getBlockPos().getY(), tes.getBlockPos().getZ());
|
||||
|
||||
double dist2 = position.distanceToSqr(pos.x, pos.y, pos.z);
|
||||
dist = Math.min(dist, dist2);
|
||||
}
|
||||
return dist;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,20 +38,21 @@ import net.minecraftforge.network.PacketDistributor;
|
|||
import net.minecraftforge.registries.DeferredRegister;
|
||||
import net.minecraftforge.registries.ForgeRegistries;
|
||||
import net.montoyo.wd.client.ClientProxy;
|
||||
import net.montoyo.wd.client.gui.camera.KeyboardCamera;
|
||||
import net.montoyo.wd.config.ClientConfig;
|
||||
import net.montoyo.wd.config.CommonConfig;
|
||||
import net.montoyo.wd.controls.ScreenControlRegistry;
|
||||
import net.montoyo.wd.core.*;
|
||||
import net.montoyo.wd.init.BlockInit;
|
||||
import net.montoyo.wd.init.ItemInit;
|
||||
import net.montoyo.wd.init.TabInit;
|
||||
import net.montoyo.wd.init.TileInit;
|
||||
import net.montoyo.wd.miniserv.server.Server;
|
||||
import net.montoyo.wd.net.WDNetworkRegistry;
|
||||
import net.montoyo.wd.net.client_bound.S2CMessageServerInfo;
|
||||
import net.montoyo.wd.registry.BlockRegistry;
|
||||
import net.montoyo.wd.registry.ItemRegistry;
|
||||
import net.montoyo.wd.registry.TileRegistry;
|
||||
import net.montoyo.wd.registry.WDTabs;
|
||||
import net.montoyo.wd.utilities.DistSafety;
|
||||
import net.montoyo.wd.utilities.Log;
|
||||
import net.montoyo.wd.utilities.Util;
|
||||
import net.montoyo.wd.utilities.serialization.Util;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.MalformedURLException;
|
||||
|
|
@ -114,6 +115,8 @@ public class WebDisplays {
|
|||
// proxies are annoying, so from now on, I'mma be just registering stuff in here
|
||||
FMLJavaModLoadingContext.get().getModEventBus().addListener(ClientProxy::onKeybindRegistry);
|
||||
MinecraftForge.EVENT_BUS.addListener(ClientProxy::onDrawSelection);
|
||||
MinecraftForge.EVENT_BUS.addListener(KeyboardCamera::updateCamera);
|
||||
MinecraftForge.EVENT_BUS.addListener(KeyboardCamera::gameTick);
|
||||
ClientConfig.init();
|
||||
}
|
||||
|
||||
|
|
@ -130,10 +133,10 @@ public class WebDisplays {
|
|||
WDNetworkRegistry.init();
|
||||
SOUNDS.register(bus);
|
||||
onRegisterSounds();
|
||||
TabInit.init(bus);
|
||||
BlockInit.init(bus);
|
||||
ItemInit.init(bus);
|
||||
TileInit.init(bus);
|
||||
WDTabs.init(bus);
|
||||
BlockRegistry.init(bus);
|
||||
ItemRegistry.init(bus);
|
||||
TileRegistry.init(bus);
|
||||
|
||||
PROXY.preInit();
|
||||
|
||||
|
|
@ -253,7 +256,7 @@ public class WebDisplays {
|
|||
if(!ev.getEntity().level().isClientSide) {
|
||||
ItemStack is = ev.getEntity().getItem();
|
||||
|
||||
if(is.getItem() == ItemInit.MINEPAD.get()) {
|
||||
if(is.getItem() == ItemRegistry.MINEPAD.get()) {
|
||||
CompoundTag tag = is.getTag();
|
||||
|
||||
if(tag == null) {
|
||||
|
|
@ -271,7 +274,7 @@ public class WebDisplays {
|
|||
|
||||
@SubscribeEvent
|
||||
public void onPlayerCraft(PlayerEvent.ItemCraftedEvent ev) {
|
||||
if(CommonConfig.hardRecipes && ItemInit.isCompCraftItem(ev.getCrafting().getItem()) && (CraftComponent.EXTCARD.makeItemStack().is(ev.getCrafting().getItem()))) {
|
||||
if(CommonConfig.hardRecipes && ItemRegistry.isCompCraftItem(ev.getCrafting().getItem()) && (CraftComponent.EXTCARD.makeItemStack().is(ev.getCrafting().getItem()))) {
|
||||
if((ev.getEntity() instanceof ServerPlayer && !hasPlayerAdvancement((ServerPlayer) ev.getEntity(), ADV_PAD_BREAK)) || PROXY.hasClientPlayerAdvancement(ADV_PAD_BREAK) != HasAdvancement.YES) {
|
||||
ev.getCrafting().setDamageValue(CraftComponent.BADEXTCARD.ordinal());
|
||||
|
||||
|
|
@ -288,6 +291,10 @@ public class WebDisplays {
|
|||
|
||||
@SubscribeEvent
|
||||
public void onLogIn(PlayerEvent.PlayerLoggedInEvent ev) {
|
||||
if (!CommonConfig.joinMessage) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(!ev.getEntity().level().isClientSide && ev.getEntity() instanceof ServerPlayer) {
|
||||
IWDDCapability cap = ev.getEntity().getCapability(WDDCapability.Provider.cap, null).orElseThrow(RuntimeException::new);
|
||||
|
||||
|
|
|
|||
|
|
@ -26,14 +26,13 @@ import net.minecraft.world.phys.shapes.Shapes;
|
|||
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||
import net.minecraftforge.network.PacketDistributor;
|
||||
import net.montoyo.wd.core.DefaultPeripheral;
|
||||
import net.montoyo.wd.entity.TileEntityKeyboard;
|
||||
import net.montoyo.wd.entity.KeyboardBlockEntity;
|
||||
import net.montoyo.wd.item.ItemLinker;
|
||||
import net.montoyo.wd.net.WDNetworkRegistry;
|
||||
import net.montoyo.wd.net.client_bound.S2CMessageCloseGui;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class BlockKeyboardLeft extends BlockPeripheral {
|
||||
|
||||
public class KeyboardBlockLeft extends PeripheralBlock {
|
||||
public static final EnumProperty<DefaultPeripheral> TYPE = EnumProperty.create("type", DefaultPeripheral.class);
|
||||
public static final DirectionProperty FACING = DirectionProperty.create("facing", Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST);
|
||||
// public static final DirectionProperty HALF = DirectionProperty.create("facing", Direction.EAST, Direction.WEST);
|
||||
|
|
@ -47,25 +46,25 @@ public class BlockKeyboardLeft extends BlockPeripheral {
|
|||
|
||||
private static final Property<?>[] properties = new Property<?>[] {TYPE, FACING};
|
||||
|
||||
public BlockKeyboardLeft() {
|
||||
public KeyboardBlockLeft() {
|
||||
super(DefaultPeripheral.KEYBOARD);
|
||||
}
|
||||
|
||||
// TODO: make non static (for extensibility purposes)
|
||||
public static TileEntityKeyboard getTileEntity(BlockState state, Level world, BlockPos pos) {
|
||||
if (state.getBlock() instanceof BlockKeyboardLeft) {
|
||||
public static KeyboardBlockEntity getTileEntity(BlockState state, Level world, BlockPos pos) {
|
||||
if (state.getBlock() instanceof KeyboardBlockLeft) {
|
||||
BlockEntity te = world.getBlockEntity(pos); // TODO: check?
|
||||
if (te instanceof TileEntityKeyboard)
|
||||
return (TileEntityKeyboard) te;
|
||||
if (te instanceof KeyboardBlockEntity)
|
||||
return (KeyboardBlockEntity) te;
|
||||
}
|
||||
|
||||
BlockPos relative = pos.relative(BlockKeyboardLeft.mapDirection(state.getValue(FACING).getOpposite()));
|
||||
BlockPos relative = pos.relative(KeyboardBlockLeft.mapDirection(state.getValue(FACING).getOpposite()));
|
||||
BlockState ns = world.getBlockState(relative);
|
||||
|
||||
if (ns.getBlock() instanceof BlockPeripheral) {
|
||||
if (ns.getBlock() instanceof PeripheralBlock) {
|
||||
BlockEntity te = world.getBlockEntity(relative); // TODO: check?
|
||||
if (te instanceof TileEntityKeyboard)
|
||||
return (TileEntityKeyboard) te;
|
||||
if (te instanceof KeyboardBlockEntity)
|
||||
return (KeyboardBlockEntity) te;
|
||||
}
|
||||
|
||||
return null;
|
||||
|
|
@ -90,7 +89,7 @@ public class BlockKeyboardLeft extends BlockPeripheral {
|
|||
public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) {
|
||||
double rpos = (entity.getY() - ((double) pos.getY())) * 16.0;
|
||||
if (!world.isClientSide && rpos >= 1.0 && rpos <= 2.0 && Math.random() < 0.25) {
|
||||
TileEntityKeyboard tek = BlockKeyboardLeft.getTileEntity(state, world, pos);
|
||||
KeyboardBlockEntity tek = KeyboardBlockLeft.getTileEntity(state, world, pos);
|
||||
|
||||
if (tek != null)
|
||||
tek.simulateCat(entity);
|
||||
|
|
@ -102,7 +101,7 @@ public class BlockKeyboardLeft extends BlockPeripheral {
|
|||
if (player.getItemInHand(hand).getItem() instanceof ItemLinker)
|
||||
return InteractionResult.PASS;
|
||||
|
||||
TileEntityKeyboard tek = BlockKeyboardLeft.getTileEntity(state, level, pos);
|
||||
KeyboardBlockEntity tek = KeyboardBlockLeft.getTileEntity(state, level, pos);
|
||||
if (tek != null)
|
||||
return tek.onRightClick(player, hand);
|
||||
|
||||
|
|
@ -120,10 +119,10 @@ public class BlockKeyboardLeft extends BlockPeripheral {
|
|||
}
|
||||
|
||||
private static void removeRightPiece(BlockState state, Level world, BlockPos pos) {
|
||||
BlockPos relative = pos.relative(BlockKeyboardLeft.mapDirection(state.getValue(FACING)));
|
||||
BlockPos relative = pos.relative(KeyboardBlockLeft.mapDirection(state.getValue(FACING)));
|
||||
|
||||
BlockState ns = world.getBlockState(relative);
|
||||
if (ns.getBlock() instanceof BlockKeyboardRight)
|
||||
if (ns.getBlock() instanceof KeyboardBlockRight)
|
||||
world.setBlock(relative, Blocks.AIR.defaultBlockState(), 3);
|
||||
}
|
||||
|
||||
|
|
@ -23,32 +23,31 @@ import net.minecraft.world.phys.shapes.Shapes;
|
|||
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||
import net.minecraftforge.network.PacketDistributor;
|
||||
import net.montoyo.wd.core.IPeripheral;
|
||||
import net.montoyo.wd.entity.TileEntityKeyboard;
|
||||
import net.montoyo.wd.entity.KeyboardBlockEntity;
|
||||
import net.montoyo.wd.item.ItemLinker;
|
||||
import net.montoyo.wd.net.WDNetworkRegistry;
|
||||
import net.montoyo.wd.net.client_bound.S2CMessageCloseGui;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.utilities.Vector3i;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.math.Vector3i;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import static net.montoyo.wd.block.BlockKeyboardLeft.KEYBOARD_AABBS;
|
||||
import static net.montoyo.wd.block.BlockPeripheral.point;
|
||||
import static net.montoyo.wd.block.KeyboardBlockLeft.KEYBOARD_AABBS;
|
||||
import static net.montoyo.wd.block.PeripheralBlock.point;
|
||||
|
||||
// TODO: merge into KeyboardLeft
|
||||
public class BlockKeyboardRight extends Block implements IPeripheral {
|
||||
|
||||
public class KeyboardBlockRight extends Block implements IPeripheral {
|
||||
public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING;
|
||||
|
||||
public BlockKeyboardRight() {
|
||||
public KeyboardBlockRight() {
|
||||
super(Properties.copy(Blocks.STONE)
|
||||
.strength(1.5f, 10.f));
|
||||
}
|
||||
|
||||
private static void removeLeftPiece(BlockState state, Level world, BlockPos pos) {
|
||||
BlockPos relative = pos.relative(BlockKeyboardLeft.mapDirection(state.getValue(FACING).getOpposite()));
|
||||
BlockPos relative = pos.relative(KeyboardBlockLeft.mapDirection(state.getValue(FACING).getOpposite()));
|
||||
|
||||
BlockState ns = world.getBlockState(relative);
|
||||
if (ns.getBlock() instanceof BlockKeyboardLeft)
|
||||
if (ns.getBlock() instanceof KeyboardBlockLeft)
|
||||
world.setBlock(relative, Blocks.AIR.defaultBlockState(), 3);
|
||||
}
|
||||
|
||||
|
|
@ -83,7 +82,7 @@ public class BlockKeyboardRight extends Block implements IPeripheral {
|
|||
|
||||
@Override
|
||||
public boolean connect(Level world, BlockPos pos, BlockState state, Vector3i scrPos, BlockSide scrSide) {
|
||||
TileEntityKeyboard keyboard = BlockKeyboardLeft.getTileEntity(state, world, pos);
|
||||
KeyboardBlockEntity keyboard = KeyboardBlockLeft.getTileEntity(state, world, pos);
|
||||
return keyboard != null && keyboard.connect(world, pos, state, scrPos, scrSide);
|
||||
}
|
||||
|
||||
|
|
@ -91,7 +90,7 @@ public class BlockKeyboardRight extends Block implements IPeripheral {
|
|||
public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) {
|
||||
double rpos = (entity.getY() - ((double) pos.getY())) * 16.0;
|
||||
if (!world.isClientSide && rpos >= 1.0 && rpos <= 2.0 && Math.random() < 0.25) {
|
||||
TileEntityKeyboard tek = BlockKeyboardLeft.getTileEntity(state, world, pos);
|
||||
KeyboardBlockEntity tek = KeyboardBlockLeft.getTileEntity(state, world, pos);
|
||||
|
||||
if (tek != null)
|
||||
tek.simulateCat(entity);
|
||||
|
|
@ -103,7 +102,7 @@ public class BlockKeyboardRight extends Block implements IPeripheral {
|
|||
if (player.getItemInHand(hand).getItem() instanceof ItemLinker)
|
||||
return InteractionResult.PASS;
|
||||
|
||||
TileEntityKeyboard tek = BlockKeyboardLeft.getTileEntity(state, level, pos);
|
||||
KeyboardBlockEntity tek = KeyboardBlockLeft.getTileEntity(state, level, pos);
|
||||
if (tek != null)
|
||||
return tek.onRightClick(player, hand);
|
||||
|
||||
|
|
@ -28,19 +28,19 @@ import net.minecraft.world.phys.shapes.Shapes;
|
|||
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||
import net.minecraftforge.network.PacketDistributor;
|
||||
import net.montoyo.wd.core.DefaultPeripheral;
|
||||
import net.montoyo.wd.entity.TileEntityInterfaceBase;
|
||||
import net.montoyo.wd.entity.TileEntityPeripheralBase;
|
||||
import net.montoyo.wd.entity.TileEntityServer;
|
||||
import net.montoyo.wd.entity.AbstractInterfaceBlockEntity;
|
||||
import net.montoyo.wd.entity.AbstractPeripheralBlockEntity;
|
||||
import net.montoyo.wd.entity.ServerBlockEntity;
|
||||
import net.montoyo.wd.item.ItemLinker;
|
||||
import net.montoyo.wd.net.WDNetworkRegistry;
|
||||
import net.montoyo.wd.net.client_bound.S2CMessageCloseGui;
|
||||
import net.montoyo.wd.utilities.Log;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public class BlockPeripheral extends WDBlockContainer {
|
||||
public class PeripheralBlock extends WDContainerBlock {
|
||||
DefaultPeripheral type;
|
||||
|
||||
public BlockPeripheral(DefaultPeripheral type) {
|
||||
public PeripheralBlock(DefaultPeripheral type) {
|
||||
super(BlockBehaviour.Properties.copy(Blocks.STONE).strength(1.5f, 10.f));
|
||||
this.type = type;
|
||||
}
|
||||
|
|
@ -49,12 +49,12 @@ public class BlockPeripheral extends WDBlockContainer {
|
|||
@Override
|
||||
public BlockEntity newBlockEntity(BlockPos pos, BlockState state) {
|
||||
BlockEntityType.BlockEntitySupplier<? extends BlockEntity> cls = type.getTEClass();
|
||||
if(cls == null)
|
||||
if (cls == null)
|
||||
return null;
|
||||
|
||||
try {
|
||||
return cls.create(pos, state);
|
||||
} catch(Throwable t) {
|
||||
} catch (Throwable t) {
|
||||
Log.errorEx("Couldn't instantiate peripheral TileEntity:", t);
|
||||
}
|
||||
|
||||
|
|
@ -68,18 +68,18 @@ public class BlockPeripheral extends WDBlockContainer {
|
|||
|
||||
@Override
|
||||
public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) {
|
||||
if(player.isShiftKeyDown())
|
||||
if (player.isShiftKeyDown())
|
||||
return InteractionResult.FAIL;
|
||||
|
||||
if(player.getItemInHand(hand).getItem() instanceof ItemLinker)
|
||||
if (player.getItemInHand(hand).getItem() instanceof ItemLinker)
|
||||
return InteractionResult.FAIL;
|
||||
|
||||
BlockEntity te = world.getBlockEntity(pos);
|
||||
|
||||
if(te instanceof TileEntityPeripheralBase)
|
||||
return ((TileEntityPeripheralBase) te).onRightClick(player, hand);
|
||||
else if(te instanceof TileEntityServer) {
|
||||
((TileEntityServer) te).onPlayerRightClick(player);
|
||||
if (te instanceof AbstractPeripheralBlockEntity)
|
||||
return ((AbstractPeripheralBlockEntity) te).onRightClick(player, hand);
|
||||
else if (te instanceof ServerBlockEntity) {
|
||||
((ServerBlockEntity) te).onPlayerRightClick(player);
|
||||
return InteractionResult.SUCCESS;
|
||||
} else
|
||||
return InteractionResult.FAIL;
|
||||
|
|
@ -92,16 +92,16 @@ public class BlockPeripheral extends WDBlockContainer {
|
|||
|
||||
@Override
|
||||
public void setPlacedBy(Level world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) {
|
||||
if(world.isClientSide)
|
||||
if (world.isClientSide)
|
||||
return;
|
||||
|
||||
if(placer instanceof Player) {
|
||||
if (placer instanceof Player) {
|
||||
BlockEntity te = world.getBlockEntity(pos);
|
||||
|
||||
if(te instanceof TileEntityServer)
|
||||
((TileEntityServer) te).setOwner((Player) placer);
|
||||
else if(te instanceof TileEntityInterfaceBase)
|
||||
((TileEntityInterfaceBase) te).setOwner((Player) placer);
|
||||
if (te instanceof ServerBlockEntity)
|
||||
((ServerBlockEntity) te).setOwner((Player) placer);
|
||||
else if (te instanceof AbstractInterfaceBlockEntity)
|
||||
((AbstractInterfaceBlockEntity) te).setOwner((Player) placer);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -113,13 +113,13 @@ public class BlockPeripheral extends WDBlockContainer {
|
|||
@Override
|
||||
public void neighborChanged(BlockState state, Level world, BlockPos pos, Block neighborType, BlockPos neighbor, boolean isMoving) {
|
||||
BlockEntity te = world.getBlockEntity(pos);
|
||||
if(te instanceof TileEntityPeripheralBase)
|
||||
((TileEntityPeripheralBase) te).onNeighborChange(neighborType, neighbor);
|
||||
if (te instanceof AbstractPeripheralBlockEntity)
|
||||
((AbstractPeripheralBlockEntity) te).onNeighborChange(neighborType, neighbor);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void playerDestroy(Level world, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack tool) {
|
||||
if(!world.isClientSide) {
|
||||
if (!world.isClientSide) {
|
||||
WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(world, pos)), new S2CMessageCloseGui(pos));
|
||||
}
|
||||
super.playerDestroy(world, player, pos, state, blockEntity, tool);
|
||||
|
|
@ -133,7 +133,7 @@ public class BlockPeripheral extends WDBlockContainer {
|
|||
public static PacketDistributor.TargetPoint point(Player exclude, Level world, BlockPos bp) {
|
||||
return new PacketDistributor.TargetPoint((ServerPlayer) exclude, bp.getX(), bp.getY(), bp.getZ(), 64.0, world.dimension());
|
||||
}
|
||||
|
||||
|
||||
public static PacketDistributor.TargetPoint point(Level world, BlockPos bp) {
|
||||
return new PacketDistributor.TargetPoint(bp.getX(), bp.getY(), bp.getZ(), 64.0, world.dimension());
|
||||
}
|
||||
|
|
@ -13,10 +13,8 @@ import net.minecraft.world.InteractionResult;
|
|||
import net.minecraft.world.entity.LivingEntity;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.context.BlockPlaceContext;
|
||||
import net.minecraft.world.level.BlockGetter;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.LevelAccessor;
|
||||
import net.minecraft.world.level.block.BaseEntityBlock;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.RenderShape;
|
||||
|
|
@ -34,64 +32,32 @@ import net.montoyo.wd.core.DefaultUpgrade;
|
|||
import net.montoyo.wd.core.IUpgrade;
|
||||
import net.montoyo.wd.core.ScreenRights;
|
||||
import net.montoyo.wd.data.SetURLData;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.init.BlockInit;
|
||||
import net.montoyo.wd.entity.ScreenData;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.item.ItemLaserPointer;
|
||||
import net.montoyo.wd.utilities.*;
|
||||
import net.montoyo.wd.utilities.math.Vector2i;
|
||||
import net.montoyo.wd.utilities.math.Vector3f;
|
||||
import net.montoyo.wd.utilities.math.Vector3i;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.serialization.Util;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class BlockScreen extends BaseEntityBlock {
|
||||
|
||||
public class ScreenBlock extends BaseEntityBlock {
|
||||
public static final BooleanProperty hasTE = BooleanProperty.create("haste");
|
||||
public static final BooleanProperty emitting = BooleanProperty.create("emitting");
|
||||
private static final Property<?>[] properties = new Property<?>[]{hasTE, emitting};
|
||||
|
||||
public BlockScreen(Properties properties) {
|
||||
public ScreenBlock(Properties properties) {
|
||||
super(properties.strength(1.5f, 10.f));
|
||||
this.registerDefaultState(this.defaultBlockState().setValue(hasTE, false).setValue(emitting, false));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
|
||||
builder.add(properties);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RenderShape getRenderShape(BlockState state) {
|
||||
return RenderShape.MODEL;
|
||||
}
|
||||
|
||||
public static boolean isntScreenBlock(Level world, Vector3i pos) {
|
||||
return world.getBlockState(pos.toBlock()).getBlock() != BlockInit.blockScreen.get();
|
||||
}
|
||||
|
||||
@org.jetbrains.annotations.Nullable
|
||||
@Override
|
||||
public BlockState getStateForPlacement(BlockPlaceContext context) {
|
||||
return super.getStateForPlacement(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor level, BlockPos currentPos, BlockPos neighborPos) {
|
||||
return super.updateShape(state, direction, neighborState, level, currentPos, neighborPos);
|
||||
}
|
||||
|
||||
public int getMetaFromState(BlockState state) {
|
||||
int ret = 0;
|
||||
if (state.getValue(hasTE))
|
||||
ret |= 1;
|
||||
|
||||
if (state.getValue(emitting))
|
||||
ret |= 2;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRemove(BlockState p_60515_, Level p_60516_, BlockPos p_60517_, BlockState p_60518_, boolean p_60519_) {
|
||||
// TODO: make this also get called on client?
|
||||
if (p_60518_.getBlock() == p_60515_.getBlock()) return;
|
||||
|
||||
|
||||
for (BlockSide value : BlockSide.values()) {
|
||||
Vector3i vec = new Vector3i(p_60517_.getX(), p_60517_.getY(), p_60517_.getZ());
|
||||
Multiblock.findOrigin(p_60516_, vec, value, null);
|
||||
|
|
@ -118,7 +84,7 @@ public class BlockScreen extends BaseEntityBlock {
|
|||
return InteractionResult.FAIL;
|
||||
else if (heldItem.getItem() instanceof ItemLaserPointer)
|
||||
return InteractionResult.FAIL; // laser pointer already handles stuff
|
||||
|
||||
|
||||
// handling the off hand leads to double clicking
|
||||
if (!isUpgrade && hand == InteractionHand.OFF_HAND)
|
||||
return InteractionResult.FAIL;
|
||||
|
|
@ -132,13 +98,13 @@ public class BlockScreen extends BaseEntityBlock {
|
|||
BlockSide side = BlockSide.values()[hit.getDirection().ordinal()];
|
||||
|
||||
Multiblock.findOrigin(world, pos, side, null);
|
||||
TileEntityScreen te = (TileEntityScreen) world.getBlockEntity(pos.toBlock());
|
||||
ScreenBlockEntity te = (ScreenBlockEntity) world.getBlockEntity(pos.toBlock());
|
||||
|
||||
if (te != null && te.getScreen(side) != null) {
|
||||
TileEntityScreen.Screen scr = te.getScreen(side);
|
||||
ScreenData scr = te.getScreen(side);
|
||||
|
||||
if (sneaking) { //Right Click
|
||||
if((scr.rightsFor(player) & ScreenRights.CHANGE_URL) == 0)
|
||||
if ((scr.rightsFor(player) & ScreenRights.CHANGE_URL) == 0)
|
||||
Util.toast(player, "restrictions");
|
||||
else
|
||||
(new SetURLData(pos, scr.side, scr.url)).sendTo((ServerPlayer) player);
|
||||
|
|
@ -170,11 +136,11 @@ public class BlockScreen extends BaseEntityBlock {
|
|||
}
|
||||
|
||||
Vector2i tmp = new Vector2i();
|
||||
|
||||
|
||||
float hitX = ((float) hit.getLocation().x) - (float) te.getBlockPos().getX();
|
||||
float hitY = ((float) hit.getLocation().y) - (float) te.getBlockPos().getY();
|
||||
float hitZ = ((float) hit.getLocation().z) - (float) te.getBlockPos().getZ();
|
||||
|
||||
|
||||
if (hit2pixels(side, hit.getBlockPos(), new Vector3i(hit.getBlockPos()), scr, hitX, hitY, hitZ, tmp))
|
||||
te.click(side, tmp);
|
||||
return InteractionResult.CONSUME;
|
||||
|
|
@ -208,7 +174,7 @@ public class BlockScreen extends BaseEntityBlock {
|
|||
if (te == null) {
|
||||
BlockPos bp = pos.toBlock();
|
||||
world.setBlockAndUpdate(bp, world.getBlockState(bp).setValue(hasTE, true));
|
||||
te = (TileEntityScreen) world.getBlockEntity(bp);
|
||||
te = (ScreenBlockEntity) world.getBlockEntity(bp);
|
||||
created = true;
|
||||
}
|
||||
|
||||
|
|
@ -218,13 +184,13 @@ public class BlockScreen extends BaseEntityBlock {
|
|||
|
||||
@Override
|
||||
public void neighborChanged(BlockState state, Level world, BlockPos pos, Block block, BlockPos source,
|
||||
boolean isMoving){
|
||||
boolean isMoving) {
|
||||
if (block != this && !world.isClientSide && !state.getValue(emitting)) {
|
||||
for (BlockSide side : BlockSide.values()) {
|
||||
Vector3i vec = new Vector3i(pos);
|
||||
Multiblock.findOrigin(world, vec, side, null);
|
||||
|
||||
TileEntityScreen tes = (TileEntityScreen) world.getBlockEntity(vec.toBlock());
|
||||
ScreenBlockEntity tes = (ScreenBlockEntity) world.getBlockEntity(vec.toBlock());
|
||||
if (tes != null && tes.hasUpgrade(side, DefaultUpgrade.REDINPUT)) {
|
||||
Direction facing = Direction.from2DDataValue(side.reverse().ordinal()); //Opposite face
|
||||
vec.sub(pos.getX(), pos.getY(), pos.getZ()).neg();
|
||||
|
|
@ -234,78 +200,63 @@ public class BlockScreen extends BaseEntityBlock {
|
|||
}
|
||||
}
|
||||
|
||||
public static boolean hit2pixels(BlockSide side, BlockPos bpos, Vector3i pos, TileEntityScreen.Screen scr, float hitX, float hitY, float hitZ, Vector2i dst) {
|
||||
public static boolean hit2pixels(BlockSide side, BlockPos bpos, Vector3i pos, ScreenData scr, float hitX, float hitY, float hitZ, Vector2i dst) {
|
||||
if(side.right.x < 0)
|
||||
hitX -= 1.f;
|
||||
|
||||
|
||||
if(side.right.z < 0 || side == BlockSide.TOP || side == BlockSide.BOTTOM)
|
||||
hitZ -= 1.f;
|
||||
|
||||
Vector3f rel = new Vector3f(bpos.getX(), bpos.getY(), bpos.getZ());
|
||||
rel.sub((float) pos.x, (float) pos.y, (float) pos.z);
|
||||
rel.add(hitX, hitY, hitZ);
|
||||
|
||||
|
||||
Vector3f rel = new Vector3f(hitX, hitY, hitZ);
|
||||
|
||||
// this dot is acting as a "get distance from plane" where the plane is the edge of the screen
|
||||
float cx = rel.dot(side.right.toFloat()) - 2.f / 16.f;
|
||||
float cy = rel.dot(side.up.toFloat()) - 2.f / 16.f;
|
||||
float sw = ((float) scr.size.x) - 4.f / 16.f;
|
||||
float sh = ((float) scr.size.y) - 4.f / 16.f;
|
||||
|
||||
|
||||
cx /= sw;
|
||||
cy /= sh;
|
||||
|
||||
if(cx >= 0.f && cx <= 1.0 && cy >= 0.f && cy <= 1.f) {
|
||||
if(side != BlockSide.BOTTOM)
|
||||
|
||||
if (cx >= 0.f && cx <= 1.0 && cy >= 0.f && cy <= 1.f) {
|
||||
if (side != BlockSide.BOTTOM)
|
||||
cy = 1.f - cy;
|
||||
|
||||
switch(scr.rotation) {
|
||||
|
||||
switch (scr.rotation) {
|
||||
case ROT_90:
|
||||
cy = 1.0f - cy;
|
||||
break;
|
||||
|
||||
|
||||
case ROT_180:
|
||||
cx = 1.0f - cx;
|
||||
cy = 1.0f - cy;
|
||||
break;
|
||||
|
||||
|
||||
case ROT_270:
|
||||
cx = 1.0f - cx;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
cx *= (float) scr.resolution.x;
|
||||
cy *= (float) scr.resolution.y;
|
||||
|
||||
if(scr.rotation.isVertical) {
|
||||
|
||||
if (scr.rotation.isVertical) {
|
||||
dst.x = (int) cy;
|
||||
dst.y = (int) cx;
|
||||
} else {
|
||||
dst.x = (int) cx;
|
||||
dst.y = (int) cy;
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@org.jetbrains.annotations.Nullable
|
||||
@Override
|
||||
public BlockEntity newBlockEntity (BlockPos pos, BlockState state){
|
||||
int meta = getMetaFromState(state);
|
||||
|
||||
if ((meta & 1) == 0)
|
||||
return null;
|
||||
|
||||
return ((meta & 1) == 0) ? null : new TileEntityScreen(pos, state);
|
||||
}
|
||||
|
||||
/************************************************* DESTRUCTION HANDLING *************************************************/
|
||||
|
||||
private void onDestroy (Level world, BlockPos pos, Player ply){
|
||||
private void onDestroy(Level world, BlockPos pos, Player ply) {
|
||||
if (!world.isClientSide) {
|
||||
Vector3i bp = new Vector3i(pos);
|
||||
Multiblock.BlockOverride override = new Multiblock.BlockOverride(bp, Multiblock.OverrideAction.SIMULATE);
|
||||
|
|
@ -315,28 +266,28 @@ public class BlockScreen extends BaseEntityBlock {
|
|||
}
|
||||
}
|
||||
|
||||
private void destroySide (Level world, Vector3i pos, BlockSide side, Multiblock.BlockOverride override, Player
|
||||
source){
|
||||
private void destroySide(Level world, Vector3i pos, BlockSide side, Multiblock.BlockOverride override, Player
|
||||
source) {
|
||||
Multiblock.findOrigin(world, pos, side, override);
|
||||
BlockPos bp = pos.toBlock();
|
||||
BlockEntity te = world.getBlockEntity(bp);
|
||||
|
||||
if (te instanceof TileEntityScreen) {
|
||||
((TileEntityScreen) te).onDestroy(source);
|
||||
if (te instanceof ScreenBlockEntity) {
|
||||
((ScreenBlockEntity) te).onDestroy(source);
|
||||
world.setBlock(bp, world.getBlockState(bp).setValue(hasTE, false), Block.UPDATE_ALL_IMMEDIATE); //Destroy tile entity.
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onDestroyedByPlayer (BlockState state, Level level, BlockPos pos, Player player,
|
||||
boolean willHarvest, FluidState fluid){
|
||||
public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, Player player,
|
||||
boolean willHarvest, FluidState fluid) {
|
||||
onDestroy(level, pos, player);
|
||||
return super.onDestroyedByPlayer(state, level, pos, player, willHarvest, fluid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPlacedBy (Level world, @NotNull BlockPos pos, @NotNull BlockState
|
||||
state, @org.jetbrains.annotations.Nullable LivingEntity whoDidThisShit, @NotNull ItemStack stack){
|
||||
public void setPlacedBy(Level world, @NotNull BlockPos pos, @NotNull BlockState
|
||||
state, @org.jetbrains.annotations.Nullable LivingEntity whoDidThisShit, @NotNull ItemStack stack) {
|
||||
if (world.isClientSide)
|
||||
return;
|
||||
|
||||
|
|
@ -351,25 +302,42 @@ public class BlockScreen extends BaseEntityBlock {
|
|||
neighbors[5] = new Vector3i(pos.getX(), pos.getY(), pos.getZ() - 1);
|
||||
|
||||
for (Vector3i neighbor : neighbors) {
|
||||
if (world.getBlockState(neighbor.toBlock()).getBlock() instanceof BlockScreen) {
|
||||
if (world.getBlockState(neighbor.toBlock()).getBlock() instanceof ScreenBlock) {
|
||||
for (BlockSide bs : BlockSide.values())
|
||||
destroySide(world, neighbor.clone(), bs, override, (whoDidThisShit instanceof Player) ? ((Player) whoDidThisShit) : null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/************************************************* STUFF THAT'S UNLIKELY TO BE TOUCHED BUT NEEDS TO BE HERE *************************************************/
|
||||
|
||||
@Override
|
||||
public @NotNull PushReaction getPistonPushReaction (BlockState state){
|
||||
public @NotNull PushReaction getPistonPushReaction(BlockState state) {
|
||||
return PushReaction.IGNORE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSignal (BlockState state, BlockGetter level, BlockPos pos, Direction direction){
|
||||
public int getSignal(BlockState state, BlockGetter level, BlockPos pos, Direction direction) {
|
||||
return state.getValue(emitting) ? 15 : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSignalSource (BlockState state){
|
||||
public boolean isSignalSource(BlockState state) {
|
||||
return state.getValue(emitting);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockEntity newBlockEntity(BlockPos pos, BlockState state) {
|
||||
return state.getValue(hasTE) ? new ScreenBlockEntity(pos, state) : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RenderShape getRenderShape(BlockState state) {
|
||||
return RenderShape.MODEL;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
|
||||
builder.add(properties);
|
||||
}
|
||||
}
|
||||
|
|
@ -7,11 +7,11 @@ package net.montoyo.wd.block;
|
|||
import net.minecraft.world.item.BlockItem;
|
||||
import net.minecraft.world.level.block.BaseEntityBlock;
|
||||
|
||||
public abstract class WDBlockContainer extends BaseEntityBlock {
|
||||
public abstract class WDContainerBlock extends BaseEntityBlock {
|
||||
|
||||
protected static BlockItem itemBlock;
|
||||
|
||||
public WDBlockContainer(Properties arg) {
|
||||
public WDContainerBlock(Properties arg) {
|
||||
super(arg);
|
||||
}
|
||||
|
||||
|
|
@ -7,48 +7,48 @@ import net.minecraft.world.item.context.BlockPlaceContext;
|
|||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.montoyo.wd.block.BlockKeyboardLeft;
|
||||
import net.montoyo.wd.init.BlockInit;
|
||||
import net.montoyo.wd.block.KeyboardBlockLeft;
|
||||
import net.montoyo.wd.registry.BlockRegistry;
|
||||
|
||||
public class KeyboardItem extends BlockItem {
|
||||
public KeyboardItem(Block arg, Properties arg2) {
|
||||
super(arg, arg2);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean placeBlock(BlockPlaceContext arg, BlockState arg2) {
|
||||
Direction facing = arg.getHorizontalDirection();
|
||||
arg2 = arg2.setValue(BlockKeyboardLeft.FACING, facing);
|
||||
|
||||
Direction d = BlockKeyboardLeft.mapDirection(facing);
|
||||
|
||||
if (isValid(arg.getClickedPos(), arg.getLevel(), arg2, d)) {
|
||||
Block kbRight = BlockInit.blockKbRight.get();
|
||||
BlockState rightState = kbRight.defaultBlockState();
|
||||
|
||||
rightState = rightState.setValue(BlockKeyboardLeft.FACING, facing);
|
||||
if (!arg.getLevel().setBlock(
|
||||
arg.getClickedPos().relative(d),
|
||||
rightState,
|
||||
11
|
||||
)) return false;
|
||||
return arg.getLevel().setBlock(arg.getClickedPos(), arg2, 11);// 161
|
||||
} else if (isValid(arg.getClickedPos().relative(d.getOpposite(), 2), arg.getLevel(), arg2, d)) {
|
||||
Block kbRight = BlockInit.blockKbRight.get();
|
||||
BlockState rightState = kbRight.defaultBlockState();
|
||||
|
||||
rightState = rightState.setValue(BlockKeyboardLeft.FACING, facing);
|
||||
if (!arg.getLevel().setBlock(
|
||||
arg.getClickedPos(),
|
||||
rightState,
|
||||
11
|
||||
)) return false;
|
||||
return arg.getLevel().setBlock(arg.getClickedPos().relative(d.getOpposite()), arg2, 11);// 161
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean isValid(BlockPos pos, Level level, BlockState state, Direction d) {
|
||||
return level.getBlockState(pos.relative(d)).isAir();
|
||||
}
|
||||
public KeyboardItem(Block arg, Properties arg2) {
|
||||
super(arg, arg2);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean placeBlock(BlockPlaceContext arg, BlockState arg2) {
|
||||
Direction facing = arg.getHorizontalDirection();
|
||||
arg2 = arg2.setValue(KeyboardBlockLeft.FACING, facing);
|
||||
|
||||
Direction d = KeyboardBlockLeft.mapDirection(facing);
|
||||
|
||||
if (isValid(arg.getClickedPos(), arg.getLevel(), arg2, d)) {
|
||||
Block kbRight = BlockRegistry.blockKbRight.get();
|
||||
BlockState rightState = kbRight.defaultBlockState();
|
||||
|
||||
rightState = rightState.setValue(KeyboardBlockLeft.FACING, facing);
|
||||
if (!arg.getLevel().setBlock(
|
||||
arg.getClickedPos().relative(d),
|
||||
rightState,
|
||||
11
|
||||
)) return false;
|
||||
return arg.getLevel().setBlock(arg.getClickedPos(), arg2, 11);// 161
|
||||
} else if (isValid(arg.getClickedPos().relative(d.getOpposite(), 2), arg.getLevel(), arg2, d)) {
|
||||
Block kbRight = BlockRegistry.blockKbRight.get();
|
||||
BlockState rightState = kbRight.defaultBlockState();
|
||||
|
||||
rightState = rightState.setValue(KeyboardBlockLeft.FACING, facing);
|
||||
if (!arg.getLevel().setBlock(
|
||||
arg.getClickedPos(),
|
||||
rightState,
|
||||
11
|
||||
)) return false;
|
||||
return arg.getLevel().setBlock(arg.getClickedPos().relative(d.getOpposite()), arg2, 11);// 161
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean isValid(BlockPos pos, Level level, BlockState state, Direction d) {
|
||||
return level.getBlockState(pos.relative(d)).isAir();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,22 +10,18 @@ import com.mojang.authlib.GameProfile;
|
|||
import com.mojang.blaze3d.platform.GlStateManager;
|
||||
import com.mojang.blaze3d.platform.InputConstants;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import net.minecraft.advancements.Advancement;
|
||||
import net.minecraft.advancements.AdvancementProgress;
|
||||
import net.minecraft.client.Camera;
|
||||
import net.minecraft.client.KeyMapping;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.Options;
|
||||
import net.minecraft.client.gui.Gui;
|
||||
import net.minecraft.client.gui.GuiGraphics;
|
||||
import net.minecraft.client.gui.screens.Screen;
|
||||
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
|
||||
import net.minecraft.client.multiplayer.ClientAdvancements;
|
||||
import net.minecraft.client.renderer.ItemBlockRenderTypes;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.blockentity.BlockEntityRenderers;
|
||||
import net.minecraft.client.renderer.texture.TextureAtlas;
|
||||
import net.minecraft.client.resources.model.Material;
|
||||
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.NonNullList;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
|
|
@ -36,6 +32,7 @@ import net.minecraft.server.packs.resources.ReloadableResourceManager;
|
|||
import net.minecraft.server.packs.resources.ResourceManager;
|
||||
import net.minecraft.server.packs.resources.ResourceManagerReloadListener;
|
||||
import net.minecraft.world.InteractionHand;
|
||||
import net.minecraft.world.entity.Entity;
|
||||
import net.minecraft.world.entity.HumanoidArm;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.inventory.Slot;
|
||||
|
|
@ -44,14 +41,16 @@ import net.minecraft.world.item.ItemStack;
|
|||
import net.minecraft.world.level.BlockGetter;
|
||||
import net.minecraft.world.level.ClipContext;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.phys.BlockHitResult;
|
||||
import net.minecraft.world.phys.HitResult;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.client.event.*;
|
||||
import net.minecraftforge.client.event.ModelEvent;
|
||||
import net.minecraftforge.client.event.RegisterKeyMappingsEvent;
|
||||
import net.minecraftforge.client.event.RenderHandEvent;
|
||||
import net.minecraftforge.client.event.RenderHighlightEvent;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.event.TickEvent;
|
||||
import net.minecraftforge.event.level.LevelEvent;
|
||||
|
|
@ -62,32 +61,34 @@ import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
|
|||
import net.minecraftforge.network.NetworkEvent;
|
||||
import net.montoyo.wd.SharedProxy;
|
||||
import net.montoyo.wd.WebDisplays;
|
||||
import net.montoyo.wd.block.BlockScreen;
|
||||
import net.montoyo.wd.block.ScreenBlock;
|
||||
import net.montoyo.wd.client.gui.*;
|
||||
import net.montoyo.wd.client.gui.loading.GuiLoader;
|
||||
import net.montoyo.wd.client.renderers.*;
|
||||
import net.montoyo.wd.config.ClientConfig;
|
||||
import net.montoyo.wd.core.HasAdvancement;
|
||||
import net.montoyo.wd.core.JSServerRequest;
|
||||
import net.montoyo.wd.data.GuiData;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.init.BlockInit;
|
||||
import net.montoyo.wd.init.ItemInit;
|
||||
import net.montoyo.wd.init.TileInit;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.entity.ScreenData;
|
||||
import net.montoyo.wd.item.ItemLaserPointer;
|
||||
import net.montoyo.wd.item.ItemMinePad2;
|
||||
import net.montoyo.wd.item.WDItem;
|
||||
import net.montoyo.wd.miniserv.client.Client;
|
||||
import net.montoyo.wd.net.WDNetworkRegistry;
|
||||
import net.montoyo.wd.net.server_bound.C2SMessageMinepadUrl;
|
||||
import net.montoyo.wd.utilities.*;
|
||||
import org.cef.CefSettings;
|
||||
import net.montoyo.wd.registry.BlockRegistry;
|
||||
import net.montoyo.wd.registry.ItemRegistry;
|
||||
import net.montoyo.wd.registry.TileRegistry;
|
||||
import net.montoyo.wd.utilities.Log;
|
||||
import net.montoyo.wd.utilities.Multiblock;
|
||||
import net.montoyo.wd.utilities.browser.WDBrowser;
|
||||
import net.montoyo.wd.utilities.browser.handlers.DisplayHandler;
|
||||
import net.montoyo.wd.utilities.browser.handlers.WDRouter;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.data.Rotation;
|
||||
import net.montoyo.wd.utilities.math.Vector2i;
|
||||
import net.montoyo.wd.utilities.math.Vector3i;
|
||||
import net.montoyo.wd.utilities.serialization.NameUUIDPair;
|
||||
import org.cef.browser.CefBrowser;
|
||||
import org.cef.browser.CefFrame;
|
||||
import org.cef.handler.CefDisplayHandler;
|
||||
import org.cef.browser.CefMessageRouter;
|
||||
import org.cef.misc.CefCursorType;
|
||||
import org.cef.network.CefRequest;
|
||||
import org.joml.Vector3d;
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
|
|
@ -97,10 +98,9 @@ import java.lang.reflect.Field;
|
|||
import java.net.InetSocketAddress;
|
||||
import java.net.SocketAddress;
|
||||
import java.util.*;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
@Mod.EventBusSubscriber(modid = "webdisplays", value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD)
|
||||
public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJSQueryHandler*/, ResourceManagerReloadListener {
|
||||
public class ClientProxy extends SharedProxy implements ResourceManagerReloadListener {
|
||||
|
||||
private static ClientProxy INSTANCE;
|
||||
|
||||
|
|
@ -150,7 +150,7 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
|
|||
|
||||
BlockPos bpos = result.getBlockPos();
|
||||
|
||||
if (result.getType() != HitResult.Type.BLOCK || mc.level.getBlockState(bpos).getBlock() != BlockInit.blockScreen.get()) {
|
||||
if (result.getType() != HitResult.Type.BLOCK || mc.level.getBlockState(bpos).getBlock() != BlockRegistry.SCREEN_BLOCk.get()) {
|
||||
RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.ONE_MINUS_DST_COLOR, GlStateManager.DestFactor.ONE_MINUS_SRC_COLOR, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);
|
||||
|
||||
poseStack.blit(new ResourceLocation(
|
||||
|
|
@ -164,9 +164,9 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
|
|||
BlockSide side = BlockSide.values()[result.getDirection().ordinal()];
|
||||
|
||||
Multiblock.findOrigin(mc.level, pos, side, null);
|
||||
TileEntityScreen te = (TileEntityScreen) mc.level.getBlockEntity(pos.toBlock());
|
||||
|
||||
TileEntityScreen.Screen sc = te.getScreen(side);
|
||||
ScreenBlockEntity te = (ScreenBlockEntity) mc.level.getBlockEntity(pos.toBlock());
|
||||
|
||||
ScreenData sc = te.getScreen(side);
|
||||
|
||||
if (sc == null) return;
|
||||
|
||||
|
|
@ -185,12 +185,20 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
|
|||
|
||||
ci.cancel();
|
||||
}
|
||||
|
||||
|
||||
public List<ScreenBlockEntity> getScreens() {
|
||||
return screenTracking;
|
||||
}
|
||||
|
||||
public List<PadData> getPads() {
|
||||
return padList;
|
||||
}
|
||||
|
||||
public class PadData {
|
||||
|
||||
public CefBrowser view;
|
||||
public final UUID id;
|
||||
private boolean isInHotbar;
|
||||
private final UUID id;
|
||||
private long lastURLSent;
|
||||
|
||||
public int activeCursor;
|
||||
|
|
@ -198,11 +206,11 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
|
|||
private PadData(String url, UUID id) {
|
||||
String webUrl;
|
||||
try {
|
||||
webUrl = TileEntityScreen.url(url);
|
||||
webUrl = ScreenBlockEntity.url(url);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
view = MCEF.createBrowser(WebDisplays.applyBlacklist(webUrl), false);
|
||||
view = WDBrowser.createBrowser(WebDisplays.applyBlacklist(webUrl), false);
|
||||
if (view instanceof MCEFBrowser browser) {
|
||||
browser.resize((int) WebDisplays.INSTANCE.padResX, (int) WebDisplays.INSTANCE.padResY);
|
||||
browser.setCursorChangeListener((cursor) -> {
|
||||
|
|
@ -212,11 +220,18 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
|
|||
isInHotbar = true;
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void updateTime() {
|
||||
lastURLSent = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
public long lastSent() {
|
||||
return lastURLSent;
|
||||
}
|
||||
}
|
||||
|
||||
private Minecraft mc;
|
||||
private MinePadRenderer minePadRenderer;
|
||||
// private JSQueryDispatcher jsDispatcher;
|
||||
private LaserPointerRenderer laserPointerRenderer;
|
||||
private Screen nextScreen;
|
||||
private boolean isF1Down;
|
||||
|
|
@ -231,7 +246,7 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
|
|||
private Map advancementToProgress;
|
||||
|
||||
//Tracking
|
||||
private final ArrayList<TileEntityScreen> screenTracking = new ArrayList<>();
|
||||
private final ArrayList<ScreenBlockEntity> screenTracking = new ArrayList<>();
|
||||
private int lastTracked = 0;
|
||||
|
||||
//MinePads Management
|
||||
|
|
@ -242,7 +257,7 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
|
|||
/**************************************** INHERITED METHODS ****************************************/
|
||||
@SubscribeEvent
|
||||
public static void onClientSetup(FMLClientSetupEvent event) {
|
||||
BlockEntityRenderers.register(TileInit.SCREEN_BLOCK_ENTITY.get(), new ScreenRenderer.ScreenRendererProvider());
|
||||
BlockEntityRenderers.register(TileRegistry.SCREEN_BLOCK_ENTITY.get(), new ScreenRenderer.ScreenRendererProvider());
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
|
|
@ -250,10 +265,6 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
|
|||
event.register(ScreenModelLoader.SCREEN_LOADER.getPath(), new ScreenModelLoader());
|
||||
}
|
||||
|
||||
private static void registerBlockRenderLayers(RenderType layer, Block... blocks) {
|
||||
Stream.of(blocks).forEach(block -> ItemBlockRenderTypes.setRenderLayer(block, layer));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void preInit() {
|
||||
super.preInit();
|
||||
|
|
@ -262,12 +273,7 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
|
|||
}
|
||||
|
||||
@Override
|
||||
public void init() {
|
||||
super.init();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCefInit(/*CefInitEvent event*/) {
|
||||
public void onCefInit() {
|
||||
minePadRenderer = new MinePadRenderer();
|
||||
laserPointerRenderer = new LaserPointerRenderer();
|
||||
|
||||
|
|
@ -281,9 +287,8 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
|
|||
}
|
||||
);
|
||||
|
||||
// jsDispatcher = new JSQueryDispatcher(this);
|
||||
MCEF.getClient().addDisplayHandler(this);
|
||||
// mcef.registerJSQueryHandler(this);
|
||||
MCEF.getClient().addDisplayHandler(DisplayHandler.INSTANCE);
|
||||
MCEF.getClient().getHandle().addMessageRouter(CefMessageRouter.create(WDRouter.INSTANCE));
|
||||
|
||||
findAdvancementToProgressField();
|
||||
}
|
||||
|
|
@ -320,7 +325,7 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
|
|||
}
|
||||
|
||||
@Override
|
||||
public void trackScreen(TileEntityScreen tes, boolean track) {
|
||||
public void trackScreen(ScreenBlockEntity tes, boolean track) {
|
||||
int idx = -1;
|
||||
for (int i = 0; i < screenTracking.size(); i++) {
|
||||
if (screenTracking.get(i) == tes) {
|
||||
|
|
@ -520,55 +525,6 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
|
|||
GuiLoader.clearCache();
|
||||
}
|
||||
|
||||
/**************************************** DISPLAY HANDLER METHODS ****************************************/
|
||||
|
||||
|
||||
@Override
|
||||
public void onAddressChange(CefBrowser browser, CefFrame cefFrame, String url) {
|
||||
if (browser != null) {
|
||||
long t = System.currentTimeMillis();
|
||||
|
||||
for (PadData pd : padList) {
|
||||
if (pd.view == browser && t - pd.lastURLSent >= 1000) {
|
||||
if (WebDisplays.isSiteBlacklisted(url))
|
||||
pd.view.loadURL(WebDisplays.BLACKLIST_URL);
|
||||
else {
|
||||
pd.lastURLSent = t; //Avoid spamming the server with porn URLs
|
||||
WDNetworkRegistry.INSTANCE.sendToServer(new C2SMessageMinepadUrl(pd.id, url));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (TileEntityScreen tes : screenTracking)
|
||||
tes.updateClientSideURL(browser, url);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTitleChange(CefBrowser cefBrowser, String s) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTooltip(CefBrowser cefBrowser, String s) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStatusMessage(CefBrowser cefBrowser, String s) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onConsoleMessage(CefBrowser cefBrowser, CefSettings.LogSeverity logSeverity, String s, String s1, int i) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCursorChange(CefBrowser cefBrowser, int i) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**************************************** JS HANDLER METHODS ****************************************/
|
||||
|
||||
// @Override
|
||||
|
|
@ -608,50 +564,21 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
|
|||
// @Override
|
||||
// public void cancelQuery(IBrowser browser, long queryId) {
|
||||
// }
|
||||
|
||||
|
||||
/**************************************** EVENT METHODS ****************************************/
|
||||
|
||||
// @SubscribeEvent
|
||||
// public void onBakeModel(ModelBakeEvent ev) {
|
||||
// for(ResourceModelPair pair : modelBakers)
|
||||
// ev.getModelRegistry().put(pair.getResourceLocation(), pair.getModel());
|
||||
// }
|
||||
|
||||
/* @SubscribeEvent
|
||||
public void onRegisterModels(ModelRegistryEvent ev) {
|
||||
final WebDisplays wd = WebDisplays.INSTANCE;
|
||||
|
||||
//I hope I'm doing this right because it doesn't seem like it...
|
||||
registerItemModel(wd.blockScreen.getItem(), 0, "inventory");
|
||||
ModelLoaderRegistry.setCustomModelResourceLocation(wd.blockPeripheral.getItem(), 0, new ModelResourceLocation("webdisplays:kb_inv", "normal"));
|
||||
registerItemModel(wd.blockPeripheral.getItem(), 1, "facing=2,type=ccinterface");
|
||||
registerItemModel(wd.blockPeripheral.getItem(), 2, "facing=2,type=cointerface");
|
||||
registerItemModel(wd.blockPeripheral.getItem(), 3, "facing=0,type=remotectrl");
|
||||
registerItemModel(wd.blockPeripheral.getItem(), 7, "facing=0,type=redstonectrl");
|
||||
registerItemModel(wd.blockPeripheral.getItem(), 11, "facing=0,type=server");
|
||||
registerItemModel(wd.itemScreenCfg, 0, "normal");
|
||||
registerItemModel(wd.itemOwnerThief, 0, "normal");
|
||||
registerItemModel(wd.itemLinker, 0, "normal");
|
||||
registerItemModel(wd.itemMinePad, 0, "normal");
|
||||
registerItemModel(wd.itemMinePad, 1, "normal");
|
||||
registerItemModel(wd.itemLaserPointer, 0, "normal");
|
||||
registerItemMultiModels(wd.itemUpgrade);
|
||||
registerItemMultiModels(wd.itemCraftComp);
|
||||
registerItemMultiModels(wd.itemAdvIcon);
|
||||
} */
|
||||
|
||||
@SubscribeEvent
|
||||
public void onLevelTick(TickEvent.LevelTickEvent ev) {
|
||||
if (!ev.side.equals(LogicalSide.CLIENT)) return;
|
||||
if (ev.phase != TickEvent.Phase.END) return;
|
||||
|
||||
//Unload/load screens depending on client player distance
|
||||
if (mc.player != null || !screenTracking.isEmpty())
|
||||
if (mc.player == null || screenTracking.isEmpty())
|
||||
return;
|
||||
|
||||
int id = lastTracked % screenTracking.size();
|
||||
|
||||
TileEntityScreen tes = screenTracking.get(id);
|
||||
ScreenBlockEntity tes = screenTracking.get(id);
|
||||
|
||||
if (!tes.getLevel().equals(ev.level))
|
||||
return;
|
||||
|
|
@ -663,27 +590,31 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
|
|||
if (!tes.isLoaded())
|
||||
tes.load();
|
||||
} else {
|
||||
double dist = Double.POSITIVE_INFINITY;
|
||||
for (int i = 0; i < tes.screenCount(); i++) {
|
||||
TileEntityScreen.Screen scrn = tes.getScreen(i);
|
||||
|
||||
Vector3d pos = new Vector3d(
|
||||
scrn.side.right.x * scrn.size.x + scrn.size.y * scrn.side.up.x,
|
||||
scrn.side.right.y * scrn.size.x + scrn.size.y * scrn.side.up.y,
|
||||
scrn.side.right.z * scrn.size.x + scrn.size.y * scrn.side.up.z
|
||||
);
|
||||
|
||||
double dist2 = mc.player.distanceToSqr(pos.x, pos.y, pos.z);
|
||||
dist = Math.min(dist, dist2);
|
||||
EntityRenderDispatcher entityRenderDispatcher = mc.getEntityRenderDispatcher();
|
||||
if (entityRenderDispatcher == null) return;
|
||||
Camera camera = entityRenderDispatcher.camera;
|
||||
Entity entity = null;
|
||||
|
||||
// ide inspection says this is a bunch of constant expressions
|
||||
// THIS IS NOT THE CASE
|
||||
// a crash HAS occurred because of this going unchecked, and I'm confused about it
|
||||
|
||||
//noinspection ConstantValue
|
||||
if (camera != null) entity = camera.getEntity();
|
||||
//noinspection ConstantValue
|
||||
if (entity == null) entity = mc.player;
|
||||
//noinspection ConstantValue
|
||||
if (entity != null) {
|
||||
double dist = distanceTo(tes, entity.getPosition(0));
|
||||
|
||||
if (tes.isLoaded()) {
|
||||
if (dist > WebDisplays.INSTANCE.unloadDistance2 * 16)
|
||||
tes.deactivate();
|
||||
// else if (ClientConfig.AutoVolumeControl.enableAutoVolume)
|
||||
// tes.updateTrackDistance(dist, 80); //ToDo find master volume
|
||||
} else if (dist <= WebDisplays.INSTANCE.loadDistance2 * 16)
|
||||
tes.activate();
|
||||
}
|
||||
|
||||
if (tes.isLoaded()) {
|
||||
if (dist > WebDisplays.INSTANCE.unloadDistance2)
|
||||
tes.unload();
|
||||
// else if (ClientConfig.AutoVolumeControl.enableAutoVolume)
|
||||
// tes.updateTrackDistance(dist, 80); //ToDo find master volume
|
||||
} else if (dist <= WebDisplays.INSTANCE.loadDistance2)
|
||||
tes.load();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -764,9 +695,6 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
|
|||
} else {
|
||||
ItemLaserPointer.deselect(mc);
|
||||
}
|
||||
|
||||
// //Handle JS queries
|
||||
// jsDispatcher.handleQueries();
|
||||
|
||||
//Miniserv
|
||||
if (msClientStarted && mc.player == null) {
|
||||
|
|
@ -780,10 +708,10 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
|
|||
Item item = ev.getItemStack().getItem();
|
||||
IItemRenderer renderer;
|
||||
|
||||
if (ItemInit.MINEPAD.isPresent() && ItemInit.LASER_POINTER.isPresent()) {
|
||||
if (item == ItemInit.MINEPAD.get())
|
||||
if (ItemRegistry.MINEPAD.isPresent() && ItemRegistry.LASER_POINTER.isPresent()) {
|
||||
if (item == ItemRegistry.MINEPAD.get())
|
||||
renderer = minePadRenderer;
|
||||
else if (item == ItemInit.LASER_POINTER.get())
|
||||
else if (item == ItemRegistry.LASER_POINTER.get())
|
||||
renderer = laserPointerRenderer;
|
||||
else
|
||||
return;
|
||||
|
|
@ -823,8 +751,8 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
|
|||
for (int i = 0; i < cnt; i++) {
|
||||
ItemStack item = inv.get(i);
|
||||
|
||||
if (ItemInit.MINEPAD.isPresent()) {
|
||||
if (item.getItem() == ItemInit.MINEPAD.get()) {
|
||||
if (ItemRegistry.MINEPAD.isPresent()) {
|
||||
if (item.getItem() == ItemRegistry.MINEPAD.get()) {
|
||||
CompoundTag tag = item.getTag();
|
||||
|
||||
if (tag != null && tag.contains("PadID"))
|
||||
|
|
@ -856,15 +784,15 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
|
|||
|
||||
public static final class ScreenSidePair {
|
||||
|
||||
public TileEntityScreen tes;
|
||||
public ScreenBlockEntity tes;
|
||||
public BlockSide side;
|
||||
|
||||
}
|
||||
|
||||
public boolean findScreenFromBrowser(CefBrowser browser, ScreenSidePair pair) {
|
||||
for (TileEntityScreen tes : screenTracking) {
|
||||
for (ScreenBlockEntity tes : screenTracking) {
|
||||
for (int i = 0; i < tes.screenCount(); i++) {
|
||||
TileEntityScreen.Screen scr = tes.getScreen(i);
|
||||
ScreenData scr = tes.getScreen(i);
|
||||
|
||||
if (scr.browser == browser) {
|
||||
pair.tes = tes;
|
||||
|
|
@ -905,7 +833,7 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
|
|||
public static void onDrawSelection(RenderHighlightEvent event) {
|
||||
if (event.getTarget() instanceof BlockHitResult bhr) {
|
||||
BlockState state = Minecraft.getInstance().level.getBlockState(bhr.getBlockPos());
|
||||
if (state.getBlock() instanceof BlockScreen screen) {
|
||||
if (state.getBlock() instanceof ScreenBlock screen) {
|
||||
Vector3i vec = new Vector3i(bhr.getBlockPos().getX(), bhr.getBlockPos().getY(), bhr.getBlockPos().getZ());
|
||||
BlockSide side = BlockSide.fromInt(bhr.getDirection().ordinal());
|
||||
Multiblock.findOrigin(
|
||||
|
|
@ -917,7 +845,7 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
|
|||
BlockEntity be = Minecraft.getInstance().level.getBlockEntity(
|
||||
pos
|
||||
);
|
||||
if (be instanceof TileEntityScreen tes) {
|
||||
if (be instanceof ScreenBlockEntity tes) {
|
||||
if (tes.getScreen(side) != null) {
|
||||
event.setCanceled(true);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import net.montoyo.wd.miniserv.Constants;
|
|||
import net.montoyo.wd.miniserv.client.Client;
|
||||
import net.montoyo.wd.miniserv.client.ClientTaskGetFile;
|
||||
import net.montoyo.wd.utilities.Log;
|
||||
import net.montoyo.wd.utilities.Util;
|
||||
import net.montoyo.wd.utilities.serialization.Util;
|
||||
import org.cef.callback.CefCallback;
|
||||
import org.cef.handler.CefResourceHandler;
|
||||
import org.cef.misc.IntRef;
|
||||
|
|
@ -16,8 +16,8 @@ import org.cef.misc.StringRef;
|
|||
import org.cef.network.CefRequest;
|
||||
import org.cef.network.CefResponse;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLDecoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.UUID;
|
||||
|
||||
public class WDScheme implements CefResourceHandler {
|
||||
|
|
@ -27,6 +27,7 @@ public class WDScheme implements CefResourceHandler {
|
|||
private boolean isErrorPage;
|
||||
|
||||
String url;
|
||||
boolean onlyError = false;
|
||||
|
||||
public WDScheme(String url) {
|
||||
this.url = url;
|
||||
|
|
@ -36,79 +37,94 @@ public class WDScheme implements CefResourceHandler {
|
|||
public boolean processRequest(CefRequest cefRequest, CefCallback cefCallback) {
|
||||
url = cefRequest.getURL();
|
||||
|
||||
url = url.substring("webdisplays://".length());
|
||||
|
||||
int pos = url.indexOf('/');
|
||||
if(pos < 0)
|
||||
if (pos < 0)
|
||||
return false;
|
||||
|
||||
String uuidStr = url.substring(0, pos);
|
||||
String fileStr = url.substring(pos + 1);
|
||||
|
||||
try {
|
||||
fileStr = URLDecoder.decode(fileStr, "UTF-8");
|
||||
} catch(UnsupportedEncodingException ex) {
|
||||
Log.warningEx("UTF-8 isn't supported... yeah... and I'm a billionaire...", ex);
|
||||
}
|
||||
fileStr = URLDecoder.decode(fileStr, StandardCharsets.UTF_8);
|
||||
|
||||
if(uuidStr.isEmpty() || Util.isFileNameInvalid(fileStr))
|
||||
return false;
|
||||
if (uuidStr.isEmpty() || Util.isFileNameInvalid(fileStr)) {
|
||||
// invalid URL or no UUID
|
||||
onlyError = true;
|
||||
cefCallback.Continue();
|
||||
return true;
|
||||
}
|
||||
|
||||
UUID uuid;
|
||||
try {
|
||||
uuid = UUID.fromString(uuidStr);
|
||||
} catch(IllegalArgumentException ex) {
|
||||
return false; //Invalid UUID
|
||||
} catch (IllegalArgumentException ex) {
|
||||
// invalid UUID
|
||||
onlyError = true;
|
||||
cefCallback.Continue();
|
||||
return true;
|
||||
}
|
||||
|
||||
task = new ClientTaskGetFile(uuid, fileStr);
|
||||
return Client.getInstance().addTask(task) ? true : false;
|
||||
boolean doContinue = Client.getInstance().addTask(task);
|
||||
if (doContinue) cefCallback.Continue();
|
||||
return doContinue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getResponseHeaders(CefResponse cefResponse, IntRef intRef, StringRef stringRef) {
|
||||
Log.info("Waiting for response...");
|
||||
int status = task.waitForResponse();
|
||||
Log.info("Got response %d", status);
|
||||
public void getResponseHeaders(CefResponse cefResponse, IntRef contentLength, StringRef redir) {
|
||||
int status;
|
||||
if (onlyError) {
|
||||
status = Constants.GETF_STATUS_BAD_NAME;
|
||||
} else {
|
||||
Log.info("Waiting for response...");
|
||||
status = task.waitForResponse();
|
||||
Log.info("Got response %d", status);
|
||||
|
||||
if(status == 0) {
|
||||
//OK
|
||||
int extPos = task.getFileName().lastIndexOf('.');
|
||||
if(extPos >= 0) {
|
||||
String mime = mapMime(task.getFileName().substring(extPos + 1));
|
||||
if (status == 0) {
|
||||
//OK
|
||||
int extPos = task.getFileName().lastIndexOf('.');
|
||||
if (extPos >= 0) {
|
||||
String mime = mapMime(task.getFileName().substring(extPos + 1));
|
||||
|
||||
if(mime != null)
|
||||
cefResponse.setMimeType(mime);
|
||||
if (mime != null)
|
||||
cefResponse.setMimeType(mime);
|
||||
}
|
||||
|
||||
cefResponse.setStatus(200);
|
||||
cefResponse.setStatusText("OK");
|
||||
contentLength.set(0);
|
||||
return;
|
||||
}
|
||||
|
||||
cefResponse.setStatus(200);
|
||||
cefResponse.setStatusText("OK");
|
||||
cefResponse.setHeaderByName("content-length", "" + -1, true);
|
||||
return;
|
||||
}
|
||||
|
||||
int errCode;
|
||||
String errStr;
|
||||
|
||||
if(status == Constants.GETF_STATUS_NOT_FOUND) {
|
||||
if (status == Constants.GETF_STATUS_NOT_FOUND) {
|
||||
errCode = 404;
|
||||
errStr = "Not Found";
|
||||
} else if (status == Constants.GETF_STATUS_TIMED_OUT) {
|
||||
errCode = 408;
|
||||
errStr = "Timed Out";
|
||||
} else if (status == Constants.GETF_STATUS_BAD_NAME) {
|
||||
errCode = 418;
|
||||
errStr = "I'm a teapot";
|
||||
} else {
|
||||
errCode = 500;
|
||||
errStr = "Internal Server Error";
|
||||
}
|
||||
|
||||
cefResponse.setStatus(errCode);
|
||||
cefResponse.setStatusText(errStr);
|
||||
// reporting the actual status and text makes CEF not display the page
|
||||
cefResponse.setStatus(200);
|
||||
cefResponse.setStatusText("OK");
|
||||
cefResponse.setMimeType("text/html");
|
||||
|
||||
try {
|
||||
dataToWrite = String.format(ERROR_PAGE, errCode, errStr).getBytes("UTF-8");
|
||||
dataOffset = 0;
|
||||
amountToWrite = dataToWrite.length;
|
||||
isErrorPage = true;
|
||||
cefResponse.setHeaderByName("content-length", "" + amountToWrite, true);
|
||||
} catch(UnsupportedEncodingException ex) {
|
||||
cefResponse.setHeaderByName("content-length", "" + 0, true);
|
||||
// cefResponse.setResponseLength(0);
|
||||
}
|
||||
dataToWrite = String.format(ERROR_PAGE, errCode, errStr).getBytes(StandardCharsets.UTF_8);
|
||||
dataOffset = 0;
|
||||
amountToWrite = dataToWrite.length;
|
||||
isErrorPage = true;
|
||||
contentLength.set(0);
|
||||
}
|
||||
|
||||
private byte[] dataToWrite;
|
||||
|
|
@ -116,10 +132,10 @@ public class WDScheme implements CefResourceHandler {
|
|||
private int amountToWrite;
|
||||
|
||||
@Override
|
||||
public boolean readResponse(byte[] bytes, int i, IntRef intRef, CefCallback cefCallback) {
|
||||
if(dataToWrite == null) {
|
||||
if(isErrorPage) {
|
||||
// data.setAmountRead(0);
|
||||
public boolean readResponse(byte[] output, int bytesToRead, IntRef bytesRead, CefCallback cefCallback) {
|
||||
if (dataToWrite == null) {
|
||||
if (isErrorPage) {
|
||||
bytesRead.set(0);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -127,25 +143,25 @@ public class WDScheme implements CefResourceHandler {
|
|||
dataOffset = 3; //packet ID + size
|
||||
amountToWrite = task.getDataLength();
|
||||
|
||||
if(amountToWrite <= 0) {
|
||||
if (amountToWrite <= 0) {
|
||||
dataToWrite = null;
|
||||
// data.setAmountRead(0);
|
||||
bytesRead.set(0);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// int toWrite = data.getBytesToRead();
|
||||
// if(toWrite > amountToWrite)
|
||||
// toWrite = amountToWrite;
|
||||
int toWrite = bytesToRead;
|
||||
if (toWrite > amountToWrite)
|
||||
toWrite = amountToWrite;
|
||||
|
||||
// System.arraycopy(dataToWrite, dataOffset, data.getDataArray(), 0, toWrite);
|
||||
// data.setAmountRead(toWrite);
|
||||
System.arraycopy(dataToWrite, dataOffset, output, 0, toWrite);
|
||||
bytesRead.set(toWrite);
|
||||
|
||||
// dataOffset += toWrite;
|
||||
// amountToWrite -= toWrite;
|
||||
dataOffset += toWrite;
|
||||
amountToWrite -= toWrite;
|
||||
|
||||
if(amountToWrite <= 0) {
|
||||
if(!isErrorPage)
|
||||
if (amountToWrite <= 0) {
|
||||
if (!isErrorPage)
|
||||
task.nextData();
|
||||
|
||||
dataToWrite = null;
|
||||
|
|
@ -156,6 +172,9 @@ public class WDScheme implements CefResourceHandler {
|
|||
|
||||
@Override
|
||||
public void cancel() {
|
||||
Log.info("Scheme query canceled or finished.");
|
||||
if (!onlyError)
|
||||
task.cancel();
|
||||
}
|
||||
|
||||
public static String mapMime(String ext) {
|
||||
|
|
|
|||
116
src/main/java/net/montoyo/wd/client/audio/WDAudioSource.java
Normal file
116
src/main/java/net/montoyo/wd/client/audio/WDAudioSource.java
Normal file
|
|
@ -0,0 +1,116 @@
|
|||
package net.montoyo.wd.client.audio;
|
||||
|
||||
import net.minecraft.client.resources.sounds.Sound;
|
||||
import net.minecraft.client.resources.sounds.SoundInstance;
|
||||
import net.minecraft.client.sounds.AudioStream;
|
||||
import net.minecraft.client.sounds.SoundBufferLibrary;
|
||||
import net.minecraft.client.sounds.SoundManager;
|
||||
import net.minecraft.client.sounds.WeighedSoundEvents;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.sounds.SoundSource;
|
||||
import net.minecraft.util.RandomSource;
|
||||
import net.minecraft.util.valueproviders.SampledFloat;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.entity.ScreenData;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
public class WDAudioSource implements SoundInstance {
|
||||
private static final ResourceLocation location = new ResourceLocation("webdisplays:audio_source");
|
||||
private static final WeighedSoundEvents events = new WeighedSoundEvents(
|
||||
location, "webdisplays.browser"
|
||||
);
|
||||
private static final SampledFloat CONST_1 = new SampledFloat() {
|
||||
@Override
|
||||
public float sample(RandomSource pRandom) {
|
||||
return 1.0f;
|
||||
}
|
||||
};
|
||||
private final Sound sound = new Sound(
|
||||
"unused",
|
||||
CONST_1,
|
||||
CONST_1,
|
||||
1, Sound.Type.SOUND_EVENT,
|
||||
true, false,
|
||||
100
|
||||
);
|
||||
ScreenBlockEntity blockEntity;
|
||||
ScreenData data;
|
||||
|
||||
public WDAudioSource(ScreenBlockEntity blockEntity, ScreenData data) {
|
||||
this.blockEntity = blockEntity;
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResourceLocation getLocation() {
|
||||
return location;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public WeighedSoundEvents resolve(SoundManager pManager) {
|
||||
return events;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<AudioStream> getStream(SoundBufferLibrary soundBuffers, Sound sound, boolean looping) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Sound getSound() {
|
||||
return sound;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SoundSource getSource() {
|
||||
return SoundSource.RECORDS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLooping() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRelative() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getDelay() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getVolume() {
|
||||
return blockEntity.ytVolume;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getPitch() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getX() {
|
||||
return blockEntity.getBlockPos().getX();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getY() {
|
||||
return blockEntity.getBlockPos().getY();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getZ() {
|
||||
return blockEntity.getBlockPos().getZ();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Attenuation getAttenuation() {
|
||||
return Attenuation.LINEAR;
|
||||
}
|
||||
}
|
||||
|
|
@ -4,44 +4,59 @@
|
|||
|
||||
package net.montoyo.wd.client.gui;
|
||||
|
||||
import com.cinemamod.mcef.MCEFBrowser;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import com.mojang.math.Axis;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.entity.Entity;
|
||||
import net.minecraft.world.phys.BlockHitResult;
|
||||
import net.minecraft.world.phys.HitResult;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.minecraftforge.fml.ModList;
|
||||
import net.minecraftforge.fml.loading.FMLPaths;
|
||||
import net.montoyo.wd.WebDisplays;
|
||||
import net.montoyo.wd.client.gui.camera.KeyboardCamera;
|
||||
import net.montoyo.wd.client.gui.controls.Button;
|
||||
import net.montoyo.wd.client.gui.controls.Control;
|
||||
import net.montoyo.wd.client.gui.controls.Label;
|
||||
import net.montoyo.wd.client.gui.loading.FillControl;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.controls.builtin.ClickControl;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.entity.ScreenData;
|
||||
import net.montoyo.wd.net.WDNetworkRegistry;
|
||||
import net.montoyo.wd.net.server_bound.C2SMessageScreenCtrl;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.utilities.Log;
|
||||
import net.montoyo.wd.utilities.TypeData;
|
||||
import net.montoyo.wd.utilities.Util;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.math.Vector2i;
|
||||
import net.montoyo.wd.utilities.serialization.TypeData;
|
||||
import net.montoyo.wd.utilities.serialization.Util;
|
||||
import org.cef.browser.CefBrowser;
|
||||
import org.cef.misc.CefCursorType;
|
||||
import org.joml.Matrix4f;
|
||||
import org.joml.Vector4f;
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
import org.vivecraft.client_vr.gameplay.VRPlayer;
|
||||
import org.vivecraft.client_vr.gameplay.screenhandlers.KeyboardHandler;
|
||||
//import org.vivecraft.gameplay.VRPlayer;
|
||||
//import org.vivecraft.gameplay.screenhandlers.KeyboardHandler;
|
||||
|
||||
import java.io.*;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Map;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public class GuiKeyboard extends WDScreen {
|
||||
|
||||
private static final String WARNING_FNAME = "wd_keyboard_warning.txt";
|
||||
|
||||
private TileEntityScreen tes;
|
||||
private ScreenBlockEntity tes;
|
||||
private BlockSide side;
|
||||
private ScreenData data;
|
||||
private final ArrayList<TypeData> evStack = new ArrayList<>();
|
||||
private BlockPos kbPos;
|
||||
private boolean showWarning = true;
|
||||
|
|
@ -56,7 +71,7 @@ public class GuiKeyboard extends WDScreen {
|
|||
super(Component.nullToEmpty(null));
|
||||
}
|
||||
|
||||
public GuiKeyboard(TileEntityScreen tes, BlockSide side, BlockPos kbPos) {
|
||||
public GuiKeyboard(ScreenBlockEntity tes, BlockSide side, BlockPos kbPos) {
|
||||
this();
|
||||
this.tes = tes;
|
||||
this.side = side;
|
||||
|
|
@ -69,7 +84,7 @@ public class GuiKeyboard extends WDScreen {
|
|||
}
|
||||
|
||||
private static final boolean vivecraftPresent;
|
||||
|
||||
|
||||
static {
|
||||
boolean vivePres = false;
|
||||
if (ModList.get().isLoaded("vivecraft")) vivePres = true;
|
||||
|
|
@ -91,7 +106,7 @@ public class GuiKeyboard extends WDScreen {
|
|||
}
|
||||
vivecraftPresent = vivePres;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void init() {
|
||||
super.init();
|
||||
|
|
@ -137,43 +152,68 @@ public class GuiKeyboard extends WDScreen {
|
|||
|
||||
defaultBackground = showWarning;
|
||||
syncTicks = 5;
|
||||
|
||||
|
||||
if (vivecraftPresent)
|
||||
if (VRPlayer.get() != null)
|
||||
KeyboardHandler.setOverlayShowing(true);
|
||||
|
||||
KeyboardCamera.focus(tes, side);
|
||||
|
||||
data = tes.getScreen(side);
|
||||
CefBrowser browser = data.browser;
|
||||
((MCEFBrowser) browser).setCursor(CefCursorType.fromId(data.mouseType));
|
||||
((MCEFBrowser) browser).setCursorChangeListener((id) -> {
|
||||
data.mouseType = id;
|
||||
((MCEFBrowser) browser).setCursor(CefCursorType.fromId(id));
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onClose() {
|
||||
public void removed() {
|
||||
super.removed();
|
||||
if (vivecraftPresent)
|
||||
if (VRPlayer.get() != null)
|
||||
KeyboardHandler.setOverlayShowing(false);
|
||||
super.onClose();
|
||||
KeyboardCamera.focus(null, null);
|
||||
CefBrowser browser = data.browser;
|
||||
if (browser instanceof MCEFBrowser mcef) {
|
||||
mcef.setCursor(CefCursorType.POINTER);
|
||||
mcef.setCursorChangeListener((cursor) -> data.mouseType = cursor);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onClose() {
|
||||
removed();
|
||||
super.onClose();
|
||||
this.minecraft.popGuiLayer();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
|
||||
if(quitOnEscape && keyCode == GLFW.GLFW_KEY_ESCAPE)
|
||||
Minecraft.getInstance().setScreen(null);
|
||||
if (quitOnEscape && keyCode == GLFW.GLFW_KEY_ESCAPE) {
|
||||
onClose();
|
||||
return true;
|
||||
}
|
||||
addKey(new TypeData(TypeData.Action.PRESS, keyCode, modifiers, scanCode));
|
||||
return super.keyPressed(keyCode, scanCode, modifiers);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean charTyped(char codePoint, int modifiers) {
|
||||
addKey(new TypeData(TypeData.Action.TYPE, codePoint, modifiers, 0));
|
||||
return super.charTyped(codePoint, modifiers);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean keyReleased(int keyCode, int scanCode, int modifiers) {
|
||||
addKey(new TypeData(TypeData.Action.RELEASE, keyCode, modifiers, scanCode));
|
||||
return super.keyPressed(keyCode, scanCode, modifiers);
|
||||
}
|
||||
|
||||
|
||||
void addKey(TypeData data) {
|
||||
tes.type(side, "[" + WebDisplays.GSON.toJson(data) + "]", kbPos);
|
||||
|
||||
|
||||
evStack.add(data);
|
||||
if (!evStack.isEmpty() && !syncRequested())
|
||||
requestSync();
|
||||
|
|
@ -243,4 +283,89 @@ public class GuiKeyboard extends WDScreen {
|
|||
return bp.equals(kbPos) || (bp.equals(tes.getBlockPos()) && side == this.side);
|
||||
}
|
||||
|
||||
protected void mouse(double mouseX, double mouseY, Consumer<Vector2i> func) {
|
||||
float pct = Minecraft.getInstance().getPartialTick();
|
||||
|
||||
double fov = Minecraft.getInstance().gameRenderer.getFov(
|
||||
Minecraft.getInstance().getEntityRenderDispatcher().camera,
|
||||
pct, true
|
||||
);
|
||||
|
||||
mouseX /= width;
|
||||
mouseY /= height;
|
||||
|
||||
mouseX -= 0.5;
|
||||
mouseY -= 0.5;
|
||||
mouseY = -mouseY;
|
||||
|
||||
Matrix4f proj = Minecraft.getInstance().gameRenderer.getProjectionMatrix(fov);
|
||||
|
||||
Entity e = Minecraft.getInstance().getEntityRenderDispatcher().camera.getEntity();
|
||||
|
||||
PoseStack camera = new PoseStack();
|
||||
float[] angle = KeyboardCamera.getAngle(e, pct);
|
||||
camera.mulPose(Axis.XP.rotationDegrees(angle[0]));
|
||||
camera.mulPose(Axis.YP.rotationDegrees(angle[1] + 180.0F));
|
||||
|
||||
Vector4f coord = new Vector4f(2f * (float) mouseX, 2 * (float) mouseY, 0, 1f);
|
||||
coord.add(proj.invert().transform(coord));
|
||||
coord = camera.last().pose().invert().transform(coord);
|
||||
|
||||
Vec3 vec3 = e.getEyePosition(pct);
|
||||
Vec3 vec31 = new Vec3(coord.x, coord.y, coord.z).normalize();
|
||||
|
||||
BlockHitResult result = tes.trace(side, vec3, vec31);
|
||||
if (result.getType() != HitResult.Type.MISS) {
|
||||
tes.interact(result, func);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseMoved(double mouseX, double mouseY) {
|
||||
mouse(mouseX, mouseY, (hit) -> {
|
||||
tes.handleMouseEvent(side, ClickControl.ControlType.MOVE, hit, -1);
|
||||
WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.laserMove(tes, side, hit));
|
||||
});
|
||||
|
||||
super.mouseMoved(mouseX, mouseY);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean mouseClicked(double mouseX, double mouseY, int button) {
|
||||
mouse(mouseX, mouseY, (hit) -> {
|
||||
tes.handleMouseEvent(side, ClickControl.ControlType.MOVE, hit, -1);
|
||||
tes.handleMouseEvent(side, ClickControl.ControlType.DOWN, hit, button);
|
||||
WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.laserDown(tes, side, hit, button));
|
||||
});
|
||||
|
||||
KeyboardCamera.setMouse(button, true);
|
||||
|
||||
return super.mouseClicked(mouseX, mouseY, button);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean mouseReleased(double mouseX, double mouseY, int button) {
|
||||
mouse(mouseX, mouseY, (hit) -> {
|
||||
tes.handleMouseEvent(side, ClickControl.ControlType.MOVE, hit, -1);
|
||||
tes.handleMouseEvent(side, ClickControl.ControlType.UP, hit, button);
|
||||
WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.laserUp(tes, side, button));
|
||||
});
|
||||
|
||||
KeyboardCamera.setMouse(button, false);
|
||||
|
||||
return super.mouseReleased(mouseX, mouseY, button);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
double mouseX = Minecraft.getInstance().mouseHandler.xpos() / Minecraft.getInstance().getWindow().getWidth();
|
||||
double mouseY = Minecraft.getInstance().mouseHandler.ypos() / Minecraft.getInstance().getWindow().getHeight();
|
||||
|
||||
mouse(mouseX * width, mouseY * height, (hit) -> {
|
||||
tes.handleMouseEvent(side, ClickControl.ControlType.MOVE, hit, -1);
|
||||
WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.laserMove(tes, side, hit));
|
||||
});
|
||||
|
||||
super.tick();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,20 +4,26 @@
|
|||
|
||||
package net.montoyo.wd.client.gui;
|
||||
|
||||
import com.cinemamod.mcef.MCEF;
|
||||
import com.cinemamod.mcef.MCEFBrowser;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.mojang.blaze3d.platform.InputConstants;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import com.mojang.blaze3d.vertex.*;
|
||||
import com.mojang.blaze3d.vertex.BufferBuilder;
|
||||
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
|
||||
import com.mojang.blaze3d.vertex.Tesselator;
|
||||
import com.mojang.blaze3d.vertex.VertexFormat;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.GuiGraphics;
|
||||
import net.minecraft.client.renderer.GameRenderer;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.locale.Language;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.montoyo.wd.WebDisplays;
|
||||
import net.montoyo.wd.client.ClientProxy;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import org.cef.browser.CefBrowserOsr;
|
||||
import net.montoyo.wd.utilities.browser.WDBrowser;
|
||||
import net.montoyo.wd.utilities.browser.handlers.js.Scripts;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import org.cef.misc.CefCursorType;
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
|
||||
|
|
@ -27,53 +33,53 @@ import static net.minecraftforge.api.distmarker.Dist.CLIENT;
|
|||
|
||||
@OnlyIn(CLIENT)
|
||||
public class GuiMinePad extends WDScreen {
|
||||
|
||||
|
||||
private ClientProxy.PadData pad;
|
||||
private double vx;
|
||||
private double vy;
|
||||
private double vw;
|
||||
private double vh;
|
||||
|
||||
|
||||
public GuiMinePad() {
|
||||
super(Component.nullToEmpty(null));
|
||||
}
|
||||
|
||||
|
||||
public GuiMinePad(ClientProxy.PadData pad) {
|
||||
this();
|
||||
this.pad = pad;
|
||||
}
|
||||
|
||||
|
||||
int trueWidth, trueHeight;
|
||||
|
||||
|
||||
@Override
|
||||
public void init() {
|
||||
vw = ((double) width) - 32.0f;
|
||||
vh = vw / WebDisplays.PAD_RATIO;
|
||||
vx = 16.0f;
|
||||
vy = (((double) height) - vh) / 2.0f;
|
||||
|
||||
|
||||
trueWidth = width;
|
||||
trueHeight = height;
|
||||
|
||||
|
||||
this.width = (int) vw;
|
||||
this.height = (int) vh;
|
||||
|
||||
|
||||
super.init();
|
||||
|
||||
|
||||
((MCEFBrowser) pad.view).setCursor(CefCursorType.fromId(pad.activeCursor));
|
||||
((MCEFBrowser) pad.view).setCursorChangeListener((id) -> {
|
||||
pad.activeCursor = id;
|
||||
((MCEFBrowser) pad.view).setCursor(CefCursorType.fromId(id));
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
private static void addRect(BufferBuilder bb, double x, double y, double w, double h) {
|
||||
bb.vertex(x, y, 0.0).color(255, 255, 255, 255).endVertex();
|
||||
bb.vertex(x + w, y, 0.0).color(255, 255, 255, 255).endVertex();
|
||||
bb.vertex(x + w, y + h, 0.0).color(255, 255, 255, 255).endVertex();
|
||||
bb.vertex(x, y + h, 0.0).color(255, 255, 255, 255).endVertex();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void render(GuiGraphics graphics, int mouseX, int mouseY, float ptt) {
|
||||
width = trueWidth;
|
||||
|
|
@ -81,10 +87,10 @@ public class GuiMinePad extends WDScreen {
|
|||
renderBackground(graphics);
|
||||
width = (int) vw;
|
||||
height = (int) vh;
|
||||
|
||||
|
||||
RenderSystem.disableCull();
|
||||
RenderSystem.setShaderColor(0.73f, 0.73f, 0.73f, 1.0f);
|
||||
|
||||
|
||||
Tesselator t = Tesselator.getInstance();
|
||||
BufferBuilder bb = t.getBuilder();
|
||||
bb.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR);
|
||||
|
|
@ -93,7 +99,7 @@ public class GuiMinePad extends WDScreen {
|
|||
addRect(bb, vx - 16, vy, 16, vh);
|
||||
addRect(bb, vx + vw, vy, 16, vh);
|
||||
t.end();
|
||||
|
||||
|
||||
if (pad.view != null) {
|
||||
// pad.view.draw(poseStack, vx, vy + vh, vx + vw, vy);
|
||||
RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
|
|
@ -114,20 +120,26 @@ public class GuiMinePad extends WDScreen {
|
|||
t.end();
|
||||
RenderSystem.enableDepthTest();
|
||||
}
|
||||
|
||||
|
||||
RenderSystem.enableCull();
|
||||
|
||||
graphics.drawString(
|
||||
minecraft.font, Language.getInstance().getOrDefault(
|
||||
"webdisplays.gui.minepad.close"
|
||||
), (int) vx + 4, (int) vy - minecraft.font.lineHeight - 3, 16777215, true
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
|
||||
return this.keyChanged(keyCode, scanCode, modifiers, true) || super.keyPressed(keyCode, scanCode, modifiers);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean keyReleased(int keyCode, int scanCode, int modifiers) {
|
||||
return this.keyChanged(keyCode, scanCode, modifiers, false) || super.keyReleased(keyCode, scanCode, modifiers);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean charTyped(char codePoint, int modifiers) {
|
||||
if (pad.view != null) {
|
||||
|
|
@ -137,60 +149,60 @@ public class GuiMinePad extends WDScreen {
|
|||
return super.charTyped(codePoint, modifiers);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* copied from MCEF */
|
||||
public boolean keyChanged(int keyCode, int scanCode, int modifiers, boolean pressed) {
|
||||
assert minecraft != null;
|
||||
if (keyCode == GLFW.GLFW_KEY_ESCAPE) {
|
||||
minecraft.setScreen(null);
|
||||
if ((modifiers & GLFW.GLFW_MOD_SHIFT) == GLFW.GLFW_MOD_SHIFT && keyCode == GLFW.GLFW_KEY_ESCAPE) {
|
||||
onClose();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
InputConstants.Key iuKey = InputConstants.getKey(keyCode, scanCode);
|
||||
String keystr = iuKey.getDisplayName().getString();
|
||||
// System.out.println("KEY STR " + keystr);
|
||||
if (keystr.length() == 0)
|
||||
return false;
|
||||
|
||||
|
||||
char key = keystr.charAt(keystr.length() - 1);
|
||||
|
||||
|
||||
if (keystr.equals("Enter")) {
|
||||
keyCode = 10;
|
||||
key = '\n';
|
||||
}
|
||||
|
||||
|
||||
if (pad.view != null) {
|
||||
if (pressed)
|
||||
((MCEFBrowser) pad.view).sendKeyPress(keyCode, scanCode, modifiers);
|
||||
else
|
||||
((MCEFBrowser) pad.view).sendKeyRelease(keyCode, scanCode, modifiers);
|
||||
|
||||
|
||||
if (pressed && key == '\n')
|
||||
if (modifiers != 0) ((MCEFBrowser) pad.view).sendKeyTyped('\r', modifiers);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void mouseMoved(double mouseX, double mouseY) {
|
||||
super.mouseMoved(mouseX, mouseY);
|
||||
mouse(-1, false, (int) mouseX, (int) mouseY, 0);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean mouseClicked(double mouseX, double mouseY, int button) {
|
||||
mouse(button, true, (int) mouseX, (int) mouseY, 0);
|
||||
return super.mouseClicked(mouseX, mouseY, button);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean mouseReleased(double mouseX, double mouseY, int button) {
|
||||
mouse(button, false, (int) mouseX, (int) mouseY, 0);
|
||||
return super.mouseReleased(mouseX, mouseY, button);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean mouseScrolled(double mouseX, double mouseY, double amount) {
|
||||
double mx = (mouseX - vx) / vw;
|
||||
|
|
@ -199,29 +211,63 @@ public class GuiMinePad extends WDScreen {
|
|||
int sy = (int) (my * WebDisplays.INSTANCE.padResY);
|
||||
// TODO: this doesn't work, and I don't understand why?
|
||||
((MCEFBrowser) pad.view).sendMouseWheel(sx, sy, amount, (hasControlDown() && !hasAltDown() && !hasShiftDown()) ? GLFW.GLFW_MOD_CONTROL : 0);
|
||||
|
||||
|
||||
return super.mouseScrolled(mouseX, mouseY, amount);
|
||||
}
|
||||
|
||||
|
||||
public void capturedMouse(double scaledX, double scaledY, int sx, int sy) {
|
||||
double centerX = (int) (0.5 * (double) this.minecraft.getWindow().getGuiScaledWidth());
|
||||
double centerY = (int) (0.5 * (double) this.minecraft.getWindow().getGuiScaledHeight());
|
||||
|
||||
if (sx == (int) centerX && sy == (int) centerY) return;
|
||||
|
||||
double mx = (centerX - vx) / vw;
|
||||
double my = (centerY - vy) / vh;
|
||||
double scaledCentX = (mx * WebDisplays.INSTANCE.padResX);
|
||||
double scaledCentY = (my * WebDisplays.INSTANCE.padResY);
|
||||
|
||||
double deltX = scaledX - scaledCentX;
|
||||
double deltY = scaledY - scaledCentY;
|
||||
|
||||
String scr = Scripts.MOUSE_EVENT;
|
||||
pad.view.executeJavaScript(
|
||||
scr
|
||||
.replace("%xCoord%", "" + (int) centerX)
|
||||
.replace("%yCoord%", "" + (int) centerY)
|
||||
.replace("%xDelta%", "" + (deltX))
|
||||
.replace("%yDelta%", "" + (deltY)),
|
||||
"WebDisplays", 0
|
||||
);
|
||||
|
||||
// lock mouse
|
||||
try {
|
||||
double xpos = (this.minecraft.getWindow().getScreenWidth() / 2);
|
||||
double ypos = (this.minecraft.getWindow().getScreenHeight() / 2);
|
||||
GLFW.glfwSetCursorPos(minecraft.getWindow().getWindow(), xpos, ypos);
|
||||
} catch (Throwable ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
public void mouse(int btn, boolean pressed, int sx, int sy, double scrollAmount) {
|
||||
double mx = (sx - vx) / vw;
|
||||
double my = (sy - vy) / vh;
|
||||
|
||||
|
||||
if (pad.view != null && mx >= 0 && mx <= 1) {
|
||||
//Scale again according to the webview
|
||||
sx = (int) (mx * WebDisplays.INSTANCE.padResX);
|
||||
sy = (int) (my * WebDisplays.INSTANCE.padResY);
|
||||
|
||||
if (btn == -1)
|
||||
((MCEFBrowser) pad.view).sendMouseMove(sx, sy);
|
||||
else if (pressed)
|
||||
((MCEFBrowser) pad.view).sendMousePress(sx, sy, btn);
|
||||
else
|
||||
((MCEFBrowser) pad.view).sendMouseRelease(sx, sy, btn);
|
||||
int scaledX = (int) (mx * WebDisplays.INSTANCE.padResX);
|
||||
int scaledY = (int) (my * WebDisplays.INSTANCE.padResY);
|
||||
|
||||
if (btn == -1) {
|
||||
if (locked)
|
||||
capturedMouse(mx * WebDisplays.INSTANCE.padResX, my * WebDisplays.INSTANCE.padResY, sx, sy);
|
||||
else ((MCEFBrowser) pad.view).sendMouseMove(scaledX, scaledY);
|
||||
} else if (pressed)
|
||||
((MCEFBrowser) pad.view).sendMousePress(scaledX, scaledY, btn);
|
||||
else ((MCEFBrowser) pad.view).sendMouseRelease(scaledX, scaledY, btn);
|
||||
pad.view.setFocus(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static Optional<Character> getChar(int keyCode, int scanCode) {
|
||||
String keystr = GLFW.glfwGetKeyName(keyCode, scanCode);
|
||||
if (keystr == null) {
|
||||
|
|
@ -233,24 +279,29 @@ public class GuiMinePad extends WDScreen {
|
|||
if (keystr.length() == 0) {
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
|
||||
return Optional.of(keystr.charAt(keystr.length() - 1));
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
if (pad.view == null)
|
||||
minecraft.setScreen(null); //In case the user dies with the pad in the hand
|
||||
pollElement();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean isForBlock(BlockPos bp, BlockSide side) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void removed() {
|
||||
super.removed();
|
||||
InputConstants.updateRawMouseInput(
|
||||
minecraft.getWindow().getWindow(),
|
||||
Minecraft.getInstance().options.rawMouseInput().get()
|
||||
);
|
||||
if (pad.view instanceof MCEFBrowser browser) {
|
||||
browser.setCursor(CefCursorType.POINTER);
|
||||
browser.setCursorChangeListener((cursor) -> {
|
||||
|
|
@ -258,10 +309,49 @@ public class GuiMinePad extends WDScreen {
|
|||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onClose() {
|
||||
super.onClose();
|
||||
removed();
|
||||
this.minecraft.popGuiLayer();
|
||||
}
|
||||
|
||||
boolean locked = false;
|
||||
double lockCenterX = -1;
|
||||
double lockCenterY = -1;
|
||||
|
||||
protected void updateCrd(JsonObject obj) {
|
||||
if (obj.getAsJsonPrimitive("exists").getAsBoolean()) {
|
||||
locked = true;
|
||||
RenderSystem.recordRenderCall(() -> {
|
||||
InputConstants.updateRawMouseInput(
|
||||
minecraft.getWindow().getWindow(),
|
||||
obj.getAsJsonPrimitive("unadjust").getAsBoolean()
|
||||
);
|
||||
GLFW.glfwSetInputMode(Minecraft.getInstance().getWindow().getWindow(), 208897, GLFW.GLFW_CURSOR_DISABLED);
|
||||
});
|
||||
lockCenterX = obj.getAsJsonPrimitive("x").getAsDouble() + obj.getAsJsonPrimitive("w").getAsDouble() / 2;
|
||||
lockCenterY = obj.getAsJsonPrimitive("y").getAsDouble() + obj.getAsJsonPrimitive("h").getAsDouble() / 2;
|
||||
} else {
|
||||
if (locked) {
|
||||
locked = false;
|
||||
RenderSystem.recordRenderCall(()->{
|
||||
InputConstants.updateRawMouseInput(
|
||||
minecraft.getWindow().getWindow(),
|
||||
Minecraft.getInstance().options.rawMouseInput().get()
|
||||
);
|
||||
GLFW.glfwSetInputMode(Minecraft.getInstance().getWindow().getWindow(), 208897, GLFW.GLFW_CURSOR_NORMAL);
|
||||
GLFW.glfwSetCursor(Minecraft.getInstance().getWindow().getWindow(), CefCursorType.fromId(pad.activeCursor).glfwId);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void pollElement() {
|
||||
if (pad.view instanceof WDBrowser browser) {
|
||||
JsonObject object = browser.pointerLockElement().getObj();
|
||||
if (object != null) updateCrd(object);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,16 +7,11 @@ package net.montoyo.wd.client.gui;
|
|||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.montoyo.wd.WebDisplays;
|
||||
import net.montoyo.wd.client.ClientProxy;
|
||||
import net.montoyo.wd.client.gui.controls.Button;
|
||||
import net.montoyo.wd.client.gui.controls.TextField;
|
||||
import net.montoyo.wd.client.gui.loading.FillControl;
|
||||
import net.montoyo.wd.net.WDNetworkRegistry;
|
||||
import net.montoyo.wd.net.server_bound.C2SMessageRedstoneCtrl;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.utilities.Util;
|
||||
import net.montoyo.wd.utilities.Vector3i;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.math.Vector3i;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
|
|
|
|||
|
|
@ -15,11 +15,16 @@ import net.montoyo.wd.WebDisplays;
|
|||
import net.montoyo.wd.client.gui.controls.*;
|
||||
import net.montoyo.wd.client.gui.loading.FillControl;
|
||||
import net.montoyo.wd.core.ScreenRights;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.entity.ScreenData;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.item.WDItem;
|
||||
import net.montoyo.wd.net.WDNetworkRegistry;
|
||||
import net.montoyo.wd.net.server_bound.C2SMessageScreenCtrl;
|
||||
import net.montoyo.wd.utilities.*;
|
||||
import net.montoyo.wd.utilities.math.Vector2i;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.data.Rotation;
|
||||
import net.montoyo.wd.utilities.serialization.NameUUIDPair;
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
|
@ -30,7 +35,7 @@ import java.util.UUID;
|
|||
public class GuiScreenConfig extends WDScreen {
|
||||
|
||||
//Screen data
|
||||
private final TileEntityScreen tes;
|
||||
private final ScreenBlockEntity tes;
|
||||
private final BlockSide side;
|
||||
private NameUUIDPair owner;
|
||||
private NameUUIDPair[] friends;
|
||||
|
|
@ -119,7 +124,7 @@ public class GuiScreenConfig extends WDScreen {
|
|||
private CheckBox[] friendBoxes;
|
||||
private CheckBox[] otherBoxes;
|
||||
|
||||
public GuiScreenConfig(Component component, TileEntityScreen tes, BlockSide side, NameUUIDPair[] friends, int fr, int or) {
|
||||
public GuiScreenConfig(Component component, ScreenBlockEntity tes, BlockSide side, NameUUIDPair[] friends, int fr, int or) {
|
||||
super(component);
|
||||
this.tes = tes;
|
||||
this.side = side;
|
||||
|
|
@ -147,7 +152,7 @@ public class GuiScreenConfig extends WDScreen {
|
|||
boxOClick.setUserdata(ScreenRights.INTERACT);
|
||||
boxOSetUrl.setUserdata(ScreenRights.CHANGE_URL);
|
||||
|
||||
TileEntityScreen.Screen scr = tes.getScreen(side);
|
||||
ScreenData scr = tes.getScreen(side);
|
||||
if(scr != null) {
|
||||
owner = scr.owner;
|
||||
rotation = scr.rotation;
|
||||
|
|
@ -191,7 +196,7 @@ public class GuiScreenConfig extends WDScreen {
|
|||
}
|
||||
|
||||
private void clickSetRes() {
|
||||
TileEntityScreen.Screen scr = tes.getScreen(side);
|
||||
ScreenData scr = tes.getScreen(side);
|
||||
if(scr == null)
|
||||
return; //WHATDAFUQ?
|
||||
|
||||
|
|
|
|||
|
|
@ -23,9 +23,11 @@ import net.montoyo.wd.miniserv.Constants;
|
|||
import net.montoyo.wd.miniserv.client.*;
|
||||
import net.montoyo.wd.net.WDNetworkRegistry;
|
||||
import net.montoyo.wd.utilities.*;
|
||||
import net.montoyo.wd.utilities.math.Vector3i;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.serialization.NameUUIDPair;
|
||||
import net.montoyo.wd.utilities.serialization.Util;
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
import org.lwjgl.opengl.GL;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import javax.swing.filechooser.FileSystemView;
|
||||
|
|
|
|||
|
|
@ -15,14 +15,14 @@ import net.montoyo.wd.client.ClientProxy;
|
|||
import net.montoyo.wd.client.gui.controls.Button;
|
||||
import net.montoyo.wd.client.gui.controls.TextField;
|
||||
import net.montoyo.wd.client.gui.loading.FillControl;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.item.ItemMinePad2;
|
||||
import net.montoyo.wd.net.WDNetworkRegistry;
|
||||
import net.montoyo.wd.net.server_bound.C2SMessageMinepadUrl;
|
||||
import net.montoyo.wd.net.server_bound.C2SMessageScreenCtrl;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.utilities.Util;
|
||||
import net.montoyo.wd.utilities.Vector3i;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.serialization.Util;
|
||||
import net.montoyo.wd.utilities.math.Vector3i;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Map;
|
||||
|
|
@ -32,7 +32,7 @@ import java.util.UUID;
|
|||
public class GuiSetURL2 extends WDScreen {
|
||||
|
||||
//Screen data
|
||||
private TileEntityScreen tileEntity;
|
||||
private ScreenBlockEntity tileEntity;
|
||||
private BlockSide screenSide;
|
||||
private Vector3i remoteLocation;
|
||||
|
||||
|
|
@ -55,7 +55,7 @@ public class GuiSetURL2 extends WDScreen {
|
|||
@FillControl
|
||||
private Button btnOk;
|
||||
|
||||
public GuiSetURL2(TileEntityScreen tes, BlockSide side, String url, Vector3i rl) {
|
||||
public GuiSetURL2(ScreenBlockEntity tes, BlockSide side, String url, Vector3i rl) {
|
||||
super(Component.nullToEmpty(null));
|
||||
tileEntity = tes;
|
||||
screenSide = side;
|
||||
|
|
@ -120,7 +120,7 @@ public class GuiSetURL2 extends WDScreen {
|
|||
if (!url.isEmpty()) {
|
||||
|
||||
try {
|
||||
TileEntityScreen.url(url);
|
||||
ScreenBlockEntity.url(url);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@ import com.google.gson.JsonArray;
|
|||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.GuiGraphics;
|
||||
import net.minecraft.client.gui.screens.Screen;
|
||||
|
|
@ -27,6 +26,10 @@ import net.montoyo.wd.client.gui.loading.JsonOWrapper;
|
|||
import net.montoyo.wd.net.WDNetworkRegistry;
|
||||
import net.montoyo.wd.net.server_bound.C2SMessageACQuery;
|
||||
import net.montoyo.wd.utilities.*;
|
||||
import net.montoyo.wd.utilities.data.Bounds;
|
||||
import net.montoyo.wd.utilities.math.Vector3i;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.serialization.NameUUIDPair;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.io.IOException;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,273 @@
|
|||
package net.montoyo.wd.client.gui.camera;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.commands.arguments.EntityAnchorArgument;
|
||||
import net.minecraft.util.Mth;
|
||||
import net.minecraft.world.entity.Entity;
|
||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.minecraft.world.phys.Vec2;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import net.minecraftforge.client.event.ViewportEvent;
|
||||
import net.minecraftforge.event.TickEvent;
|
||||
import net.montoyo.wd.client.gui.GuiKeyboard;
|
||||
import net.montoyo.wd.config.ClientConfig;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.entity.ScreenData;
|
||||
import net.montoyo.wd.utilities.browser.WDBrowser;
|
||||
import net.montoyo.wd.utilities.browser.handlers.js.queries.ElementCenterQuery;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
|
||||
public class KeyboardCamera {
|
||||
private static ScreenBlockEntity tes;
|
||||
private static BlockSide side;
|
||||
|
||||
private static double oxCrd = -1;
|
||||
private static double xCrd = -1;
|
||||
private static double nxCrd = -1;
|
||||
private static double oyCrd = -1;
|
||||
private static double yCrd = -1;
|
||||
private static double nyCrd = -1;
|
||||
|
||||
private static double nextX = -1;
|
||||
private static double nextY = -1;
|
||||
private static double focalX = -1;
|
||||
private static double focalY = -1;
|
||||
|
||||
private static final boolean[] mouseStatus = new boolean[2];
|
||||
|
||||
protected static Vec2 pxToHit(ScreenData scr, Vec2 dst) {
|
||||
float cx, cy;
|
||||
if (scr.rotation.isVertical) {
|
||||
cy = dst.x;
|
||||
cx = dst.y;
|
||||
} else {
|
||||
cx = dst.x;
|
||||
cy = dst.y;
|
||||
}
|
||||
|
||||
cx /= (float) scr.resolution.x;
|
||||
cy /= (float) scr.resolution.y;
|
||||
|
||||
switch (scr.rotation) {
|
||||
case ROT_270:
|
||||
cx = 1.0f - cx;
|
||||
break;
|
||||
|
||||
case ROT_180:
|
||||
cx = 1.0f - cx;
|
||||
cy = 1.0f - cy;
|
||||
break;
|
||||
|
||||
case ROT_90:
|
||||
cy = 1.0f - cy;
|
||||
break;
|
||||
}
|
||||
|
||||
if (side != BlockSide.BOTTOM)
|
||||
cy = 1.0f - cy;
|
||||
|
||||
float swInverse = (((float) scr.size.x) - 4.f / 16.f);
|
||||
float shInverse = (((float) scr.size.y) - 4.f / 16.f);
|
||||
|
||||
cx *= swInverse;
|
||||
cy *= shInverse;
|
||||
|
||||
if (side.right.x > 0 || side.right.z > 0)
|
||||
cx += 1.f;
|
||||
|
||||
if (side == BlockSide.TOP || side == BlockSide.BOTTOM)
|
||||
cy -= 1.f;
|
||||
|
||||
return new Vec2(cx + (2 / 16f), cy + (2 / 16f));
|
||||
}
|
||||
|
||||
protected static void updateCrd(ElementCenterQuery lock) {
|
||||
ScreenData scr = tes.getScreen(side);
|
||||
if (scr != null) {
|
||||
Vec2 c;
|
||||
|
||||
if (!mouseStatus[0] && !mouseStatus[1]) {
|
||||
if (lock.hasFocused()) {
|
||||
if (ClientConfig.Input.keyboardCamera) {
|
||||
nextX = lock.getX();
|
||||
nextY = lock.getY();
|
||||
|
||||
c = pxToHit(scr, new Vec2((float) nextX, (float) nextY));
|
||||
} else c = new Vec2(scr.size.x / 2f, scr.size.y / 2f);
|
||||
} else c = new Vec2(scr.size.x / 2f, scr.size.y / 2f);
|
||||
// } else c = new Vec2((float) focalX, (float) focalY);
|
||||
} else return;
|
||||
|
||||
focalX = c.x;
|
||||
focalY = c.y;
|
||||
|
||||
nextX = c.x;
|
||||
nextY = c.y;
|
||||
|
||||
if (nextX < 0) nextX = 0;
|
||||
else if (nextX > scr.size.x) nextX = scr.size.x;
|
||||
if (nextY < 0) nextY = 0;
|
||||
else if (nextY > scr.size.y) nextY = scr.size.y;
|
||||
|
||||
float scl = Math.max(scr.size.x, scr.size.y);
|
||||
|
||||
double mx = Minecraft.getInstance().mouseHandler.xpos();
|
||||
mx /= Minecraft.getInstance().getWindow().getWidth();
|
||||
|
||||
double my = Minecraft.getInstance().mouseHandler.ypos();
|
||||
my /= Minecraft.getInstance().getWindow().getHeight();
|
||||
|
||||
Vec2 v2 = new Vec2((float) mx, (float) my).add(-0.5f);
|
||||
|
||||
nextX += v2.x * scl;
|
||||
nextY -= v2.y * scl;
|
||||
}
|
||||
}
|
||||
|
||||
protected static void pollElement() {
|
||||
ScreenBlockEntity teTmp = tes;
|
||||
BlockSide sdTmp = side;
|
||||
|
||||
// async nonsense can occur here
|
||||
if (teTmp == null || sdTmp == null) return;
|
||||
|
||||
ScreenData scr = teTmp.getScreen(sdTmp);
|
||||
if (scr != null) {
|
||||
if (scr.browser instanceof WDBrowser wdBrowser) {
|
||||
wdBrowser.focusedElement().dispatch(scr.browser);
|
||||
updateCrd(((WDBrowser) scr.browser).focusedElement());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static float[] getAngle(Entity e, double pct) {
|
||||
BlockEntity tes = KeyboardCamera.tes;
|
||||
BlockSide side = KeyboardCamera.side;
|
||||
if (tes == null) return new float[]{Float.NaN, 0};
|
||||
if (side == null) return new float[]{Float.NaN, 0};
|
||||
|
||||
double coxCrd = Mth.lerp(0.5 * pct, oxCrd, xCrd);
|
||||
double coyCrd = Mth.lerp(0.5 * pct, oyCrd, yCrd);
|
||||
|
||||
double focalX = tes.getBlockPos().getX() +
|
||||
side.right.x * (coxCrd - 1) + side.up.x * coyCrd + Math.abs(side.forward.x) * 0.5;
|
||||
double focalY = tes.getBlockPos().getY() +
|
||||
side.right.y * (coxCrd - 1) + side.up.y * coyCrd + Math.abs(side.forward.y) * 0.5;
|
||||
double focalZ = tes.getBlockPos().getZ() +
|
||||
side.right.z * (coxCrd - 1) + side.up.z * coyCrd + Math.abs(side.forward.z) * 0.5;
|
||||
|
||||
focalX += side.forward.x * 0.5f;
|
||||
focalY += side.forward.y * 0.5f;
|
||||
focalZ += side.forward.z * 0.5f;
|
||||
|
||||
float[] angle = lookAt(
|
||||
e, EntityAnchorArgument.Anchor.EYES,
|
||||
new Vec3(focalX, focalY, focalZ)
|
||||
);
|
||||
|
||||
return angle;
|
||||
}
|
||||
|
||||
public static void setMouse(int side, boolean pressed) {
|
||||
mouseStatus[side] = pressed;
|
||||
}
|
||||
|
||||
public static void updateCamera(ViewportEvent.ComputeCameraAngles event) {
|
||||
if (tes == null) {
|
||||
xCrd = -1;
|
||||
yCrd = -1;
|
||||
return; // nothing to do
|
||||
}
|
||||
|
||||
if (xCrd == -1) return;
|
||||
if (yCrd == -1) return;
|
||||
|
||||
float[] angle = getAngle(event.getCamera().getEntity(), event.getPartialTick());
|
||||
|
||||
if (Float.isNaN(angle[0])) return;
|
||||
|
||||
// float xRot = event.getYaw(); // left right
|
||||
// float yRot = event.getPitch(); // up down
|
||||
|
||||
// TODO: smooth in/out
|
||||
event.setYaw(angle[1]);
|
||||
event.setPitch(angle[0]);
|
||||
}
|
||||
|
||||
public static void focus(ScreenBlockEntity screen, BlockSide side) {
|
||||
KeyboardCamera.tes = screen;
|
||||
KeyboardCamera.side = side;
|
||||
}
|
||||
|
||||
public static float[] lookAt(Entity entity, EntityAnchorArgument.Anchor pAnchor, Vec3 pTarget) {
|
||||
Vec3 vec3 = pAnchor.apply(entity);
|
||||
double d0 = pTarget.x - vec3.x;
|
||||
double d1 = pTarget.y - vec3.y;
|
||||
double d2 = pTarget.z - vec3.z;
|
||||
double d3 = Math.sqrt(d0 * d0 + d2 * d2);
|
||||
float xr = (Mth.wrapDegrees((float) (-(Mth.atan2(d1, d3) * (double) (180F / (float) Math.PI)))));
|
||||
float yr = (Mth.wrapDegrees((float) (Mth.atan2(d2, d0) * (double) (180F / (float) Math.PI)) - 90.0F));
|
||||
return new float[]{xr, yr};
|
||||
}
|
||||
|
||||
protected static int delay = 8;
|
||||
|
||||
public static void gameTick(TickEvent.ClientTickEvent event) {
|
||||
if (mouseStatus[0] || mouseStatus[1]) {
|
||||
oxCrd = Mth.lerp(0.5, oxCrd, xCrd);
|
||||
oyCrd = Mth.lerp(0.5, oyCrd, yCrd);
|
||||
return;
|
||||
}
|
||||
if (event.phase.equals(TickEvent.Phase.END)) {
|
||||
if (side == null) {
|
||||
delay = 1;
|
||||
oxCrd = -1;
|
||||
oyCrd = -1;
|
||||
xCrd = -1;
|
||||
yCrd = -1;
|
||||
nxCrd = -1;
|
||||
nyCrd = -1;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(Minecraft.getInstance().screen instanceof GuiKeyboard)) {
|
||||
tes = null;
|
||||
side = null;
|
||||
return;
|
||||
}
|
||||
|
||||
pollElement();
|
||||
|
||||
double anxx = nextX;
|
||||
double anxy = nextY;
|
||||
|
||||
if (
|
||||
anxx == -1 || anxy == -1 ||
|
||||
nxCrd == -1 || nyCrd == -1 ||
|
||||
oxCrd == -1 || oyCrd == -1 ||
|
||||
xCrd == -1 || yCrd == -1
|
||||
) {
|
||||
ScreenData data = tes.getScreen(side);
|
||||
if (data == null)
|
||||
return;
|
||||
|
||||
anxx = data.size.x / 2.0;
|
||||
anxy = data.size.y / 2.0;
|
||||
|
||||
if (nxCrd == -1) {
|
||||
oxCrd = xCrd = anxx;
|
||||
oyCrd = yCrd = anxy;
|
||||
}
|
||||
}
|
||||
|
||||
nxCrd = anxx;
|
||||
nyCrd = anxy;
|
||||
|
||||
oxCrd = Mth.lerp(0.5, oxCrd, xCrd);
|
||||
xCrd = Mth.lerp(0.15, xCrd, nxCrd);
|
||||
|
||||
oyCrd = Mth.lerp(0.5, oyCrd, yCrd);
|
||||
yCrd = Mth.lerp(0.15, yCrd, nyCrd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -14,20 +14,18 @@ import net.minecraft.client.gui.GuiGraphics;
|
|||
import net.minecraft.client.renderer.GameRenderer;
|
||||
import net.minecraft.client.renderer.MultiBufferSource;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.ShaderInstance;
|
||||
import net.minecraft.client.resources.language.I18n;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.montoyo.wd.client.gui.WDScreen;
|
||||
import net.montoyo.wd.client.gui.loading.JsonOWrapper;
|
||||
import net.montoyo.wd.utilities.Bounds;
|
||||
import net.montoyo.wd.utilities.data.Bounds;
|
||||
import org.joml.Matrix4f;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import static com.mojang.math.Axis.XP;
|
||||
import static org.lwjgl.opengl.GL11.*;
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public abstract class Control {
|
||||
|
|
|
|||
|
|
@ -7,18 +7,14 @@ package net.montoyo.wd.client.gui.controls;
|
|||
import com.mojang.blaze3d.platform.GlStateManager;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import com.mojang.blaze3d.vertex.VertexFormat;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.GuiGraphics;
|
||||
import net.montoyo.wd.client.gui.loading.JsonOWrapper;
|
||||
import net.montoyo.wd.utilities.Bounds;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
import net.montoyo.wd.utilities.data.Bounds;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import static org.lwjgl.opengl.GL11.*;
|
||||
|
||||
public class ControlGroup extends Container {
|
||||
|
||||
private int width;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ package net.montoyo.wd.client.gui.controls;
|
|||
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.montoyo.wd.client.gui.loading.JsonOWrapper;
|
||||
import net.montoyo.wd.utilities.Util;
|
||||
import net.montoyo.wd.utilities.serialization.Util;
|
||||
import net.montoyo.wd.utilities.VideoType;
|
||||
|
||||
import java.net.MalformedURLException;
|
||||
|
|
|
|||
|
|
@ -16,10 +16,9 @@ import net.minecraft.world.phys.Vec3;
|
|||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.montoyo.wd.client.ClientProxy;
|
||||
import net.montoyo.wd.init.ItemInit;
|
||||
import net.montoyo.wd.registry.ItemRegistry;
|
||||
import net.montoyo.wd.item.ItemLaserPointer;
|
||||
import org.joml.Matrix4f;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import static com.mojang.math.Axis.*;
|
||||
|
||||
|
|
@ -40,7 +39,7 @@ public final class LaserPointerRenderer implements IItemRenderer {
|
|||
ClientProxy.mouseOn ||
|
||||
ItemLaserPointer.isOn()
|
||||
) &&
|
||||
mc.player.getItemInHand(InteractionHand.MAIN_HAND).getItem().equals(ItemInit.LASER_POINTER.get()) &&
|
||||
mc.player.getItemInHand(InteractionHand.MAIN_HAND).getItem().equals(ItemRegistry.LASER_POINTER.get()) &&
|
||||
(mc.hitResult == null || mc.hitResult.getType() == HitResult.Type.BLOCK || mc.hitResult.getType() == HitResult.Type.MISS);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -19,9 +19,9 @@ import net.minecraft.world.level.BlockAndTintGetter;
|
|||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraftforge.client.model.data.ModelData;
|
||||
import net.minecraftforge.client.model.data.ModelProperty;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.utilities.Vector3f;
|
||||
import net.montoyo.wd.utilities.Vector3i;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.math.Vector3f;
|
||||
import net.montoyo.wd.utilities.math.Vector3i;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
|
|
|
|||
|
|
@ -7,25 +7,27 @@ package net.montoyo.wd.client.renderers;
|
|||
import com.cinemamod.mcef.MCEFBrowser;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import com.mojang.blaze3d.vertex.*;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.GameRenderer;
|
||||
import net.minecraft.client.renderer.MultiBufferSource;
|
||||
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
|
||||
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.utilities.Vector3f;
|
||||
import net.montoyo.wd.utilities.Vector3i;
|
||||
import net.montoyo.wd.WebDisplays;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.entity.ScreenData;
|
||||
import net.montoyo.wd.utilities.math.Vector3f;
|
||||
import net.montoyo.wd.utilities.math.Vector3i;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import static com.mojang.math.Axis.*;
|
||||
|
||||
public class ScreenRenderer implements BlockEntityRenderer<TileEntityScreen> {
|
||||
public class ScreenRenderer implements BlockEntityRenderer<ScreenBlockEntity> {
|
||||
public ScreenRenderer() {
|
||||
}
|
||||
|
||||
public static class ScreenRendererProvider implements BlockEntityRendererProvider<TileEntityScreen> {
|
||||
public static class ScreenRendererProvider implements BlockEntityRendererProvider<ScreenBlockEntity> {
|
||||
@Override
|
||||
public @NotNull BlockEntityRenderer<TileEntityScreen> create(@NotNull Context arg) {
|
||||
public @NotNull BlockEntityRenderer<ScreenBlockEntity> create(@NotNull Context arg) {
|
||||
return new ScreenRenderer();
|
||||
}
|
||||
}
|
||||
|
|
@ -35,19 +37,22 @@ public class ScreenRenderer implements BlockEntityRenderer<TileEntityScreen> {
|
|||
private final Vector3f tmpf = new Vector3f();
|
||||
|
||||
@Override
|
||||
public void render(TileEntityScreen te, float partialTick, @NotNull PoseStack poseStack, @NotNull MultiBufferSource bufferSource, int packedLight, int packedOverlay) {
|
||||
public void render(ScreenBlockEntity te, float partialTick, @NotNull PoseStack poseStack, @NotNull MultiBufferSource bufferSource, int packedLight, int packedOverlay) {
|
||||
if (!te.isLoaded())
|
||||
return;
|
||||
|
||||
|
||||
//Disable lighting
|
||||
// RenderSystem.enableTexture();
|
||||
// RenderSystem.disableCull();
|
||||
// RenderSystem.disableCull();
|
||||
RenderSystem.disableBlend();
|
||||
|
||||
for (int i = 0; i < te.screenCount(); i++) {
|
||||
TileEntityScreen.Screen scr = te.getScreen(i);
|
||||
ScreenData scr = te.getScreen(i);
|
||||
if (scr.browser == null) {
|
||||
scr.createBrowser(true);
|
||||
double dist = WebDisplays.PROXY.distanceTo(te, Minecraft.getInstance().getEntityRenderDispatcher().camera.getPosition());
|
||||
if (dist <= WebDisplays.INSTANCE.loadDistance2 * 16)
|
||||
scr.createBrowser(te, true);
|
||||
else continue;
|
||||
}
|
||||
|
||||
// TODO: manually backface cull the screens
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ public class ClientConfig {
|
|||
"Due to how web browsers work however, the larger this value is, the smaller text is",
|
||||
"Also, higher values will invariably lag more",
|
||||
"A good goto value for this would be the height of your monitor, in pixels",
|
||||
"A standard monitor is (at least currently) 1080"
|
||||
"A standard monitor is (at least currently) 1080",
|
||||
})
|
||||
@Translation("config.webdisplays.pad_res")
|
||||
@IntRange(minV = 0, maxV = Integer.MAX_VALUE)
|
||||
|
|
@ -53,55 +53,70 @@ public class ClientConfig {
|
|||
@Translation("config.webdisplays.side_pad")
|
||||
@Default(valueBoolean = true)
|
||||
public static boolean sidePad = true;
|
||||
|
||||
@Name("switch_buttons")
|
||||
@Comment("If the left and right buttons should be swapped when using a laser")
|
||||
@Translation("config.webdisplays.switch_buttons")
|
||||
@DoubleRange(minV = 0, maxV = Double.MAX_VALUE)
|
||||
@Default(valueD = 30)
|
||||
public static boolean switchButtons = true;
|
||||
|
||||
|
||||
@Comment({
|
||||
"AutoVolume makes audio fade off based on distance",
|
||||
"Currently, this seems to not work"
|
||||
"Options relating to input handling"
|
||||
})
|
||||
@CFGSegment("auto_volume")
|
||||
public static class AutoVolumeControl {
|
||||
@Name("enabled")
|
||||
@Comment("Whether or not auto volume should be enabled")
|
||||
@Translation("config.webdisplays.auto_vol")
|
||||
@CFGSegment("input")
|
||||
public static class Input {
|
||||
@Name("keyboard_camera")
|
||||
@Comment({
|
||||
"If this is on, then the camera will try to focus on the selected element while a keyboard is in use",
|
||||
"Elsewise, it'll try to focus on the center of the screen",
|
||||
})
|
||||
@Translation("config.webdisplays.keyboard_camera")
|
||||
@Default(valueBoolean = true)
|
||||
public static boolean enableAutoVolume = true;
|
||||
|
||||
@Name("youtube_volume")
|
||||
@Comment("How loud youtube should be by default")
|
||||
@Translation("config.webdisplays.yt_vol")
|
||||
@DoubleRange(minV = 0, maxV = 100)
|
||||
@Default(valueD = 100)
|
||||
public static double ytVolume = 100.0;
|
||||
|
||||
@Name("dist0")
|
||||
@Comment("Distance after which you can't hear anything (in blocks)")
|
||||
@Translation("config.webdisplays.d0")
|
||||
public static boolean keyboardCamera = true;
|
||||
|
||||
@Name("switch_buttons")
|
||||
@Comment("If the left and right buttons should be swapped when using a laser")
|
||||
@Translation("config.webdisplays.switch_buttons")
|
||||
@DoubleRange(minV = 0, maxV = Double.MAX_VALUE)
|
||||
@Default(valueD = 30)
|
||||
public static double dist0 = 30.0;
|
||||
|
||||
@Name("dist100")
|
||||
@Comment("Distance after which the sound starts dropping (in blocks)")
|
||||
@Translation("config.webdisplays.d100")
|
||||
@DoubleRange(minV = 0, maxV = Double.MAX_VALUE)
|
||||
@Default(valueD = 10)
|
||||
public static double dist100 = 10.0;
|
||||
public static boolean switchButtons = true;
|
||||
}
|
||||
|
||||
// @Comment({
|
||||
// "AutoVolume makes audio fade off based on distance",
|
||||
// "Currently, this seems to not work"
|
||||
// })
|
||||
// @CFGSegment("auto_volume")
|
||||
// public static class AutoVolumeControl {
|
||||
// @Name("enabled")
|
||||
// @Comment("Whether or not auto volume should be enabled")
|
||||
// @Translation("config.webdisplays.auto_vol")
|
||||
// @Default(valueBoolean = true)
|
||||
// public static boolean enableAutoVolume = true;
|
||||
//
|
||||
// @Name("youtube_volume")
|
||||
// @Comment("How loud youtube should be by default")
|
||||
// @Translation("config.webdisplays.yt_vol")
|
||||
// @DoubleRange(minV = 0, maxV = 100)
|
||||
// @Default(valueD = 100)
|
||||
// public static double ytVolume = 100.0;
|
||||
//
|
||||
// @Name("dist0")
|
||||
// @Comment("Distance after which you can't hear anything (in blocks)")
|
||||
// @Translation("config.webdisplays.d0")
|
||||
// @DoubleRange(minV = 0, maxV = Double.MAX_VALUE)
|
||||
// @Default(valueD = 30)
|
||||
// public static double dist0 = 30.0;
|
||||
//
|
||||
// @Name("dist100")
|
||||
// @Comment("Distance after which the sound starts dropping (in blocks)")
|
||||
// @Translation("config.webdisplays.d100")
|
||||
// @DoubleRange(minV = 0, maxV = Double.MAX_VALUE)
|
||||
// @Default(valueD = 10)
|
||||
// public static double dist100 = 10.0;
|
||||
// }
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public static void postLoad() {
|
||||
if (unloadDistance < loadDistance + 2.0)
|
||||
unloadDistance = loadDistance + 2.0;
|
||||
|
||||
if (AutoVolumeControl.dist0 < AutoVolumeControl.dist100 + 0.1)
|
||||
AutoVolumeControl.dist0 = AutoVolumeControl.dist100 + 0.1;
|
||||
// if (AutoVolumeControl.dist0 < AutoVolumeControl.dist100 + 0.1)
|
||||
// AutoVolumeControl.dist0 = AutoVolumeControl.dist100 + 0.1;
|
||||
|
||||
// cache pad resolution
|
||||
WebDisplays.INSTANCE.padResY = padResolution;
|
||||
|
|
@ -111,8 +126,8 @@ public class ClientConfig {
|
|||
WebDisplays.INSTANCE.unloadDistance2 = unloadDistance * unloadDistance;
|
||||
WebDisplays.INSTANCE.loadDistance2 = loadDistance * loadDistance;
|
||||
|
||||
WebDisplays.INSTANCE.ytVolume = (float) AutoVolumeControl.ytVolume;
|
||||
WebDisplays.INSTANCE.avDist100 = (float) AutoVolumeControl.dist100;
|
||||
WebDisplays.INSTANCE.avDist0 = (float) AutoVolumeControl.dist0;
|
||||
// WebDisplays.INSTANCE.ytVolume = (float) AutoVolumeControl.ytVolume;
|
||||
// WebDisplays.INSTANCE.avDist100 = (float) AutoVolumeControl.dist100;
|
||||
// WebDisplays.INSTANCE.avDist0 = (float) AutoVolumeControl.dist0;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,13 +18,18 @@ public class CommonConfig {
|
|||
public static void init() {
|
||||
// loads the class
|
||||
}
|
||||
|
||||
|
||||
@Name("hard_recipes")
|
||||
@Comment("If true, breaking the minePad is required to craft upgrades.")
|
||||
@Translation("config.webdisplays.hard_recipes")
|
||||
@IntRange(minV = 0, maxV = Integer.MAX_VALUE)
|
||||
@Default(valueBoolean = true)
|
||||
public static boolean hardRecipes = true;
|
||||
|
||||
@Name("join_message")
|
||||
@Comment("Whether or not webdisplays should thank the user for using the mod")
|
||||
@Translation("config.webdisplays.join_message")
|
||||
@Default(valueBoolean = true)
|
||||
public static boolean joinMessage = true;
|
||||
|
||||
@Name("disable_ownership_thief")
|
||||
@Comment("If true, the ownership thief item will be disabled")
|
||||
|
|
|
|||
|
|
@ -8,8 +8,8 @@ import net.minecraftforge.api.distmarker.Dist;
|
|||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.minecraftforge.network.NetworkEvent;
|
||||
import net.montoyo.wd.core.MissingPermissionException;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.function.Function;
|
||||
|
|
@ -22,9 +22,9 @@ public abstract class ScreenControl {
|
|||
}
|
||||
|
||||
public abstract void write(FriendlyByteBuf buf);
|
||||
public abstract void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function<Integer, Boolean> permissionChecker) throws MissingPermissionException;
|
||||
public abstract void handleServer(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx, Function<Integer, Boolean> permissionChecker) throws MissingPermissionException;
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public abstract void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx);
|
||||
public abstract void handleClient(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx);
|
||||
|
||||
public void checkPerms(int perms, Function<Integer, Boolean> checker, ServerPlayer player) throws MissingPermissionException {
|
||||
if (!checker.apply(perms)) {
|
||||
|
|
|
|||
|
|
@ -8,8 +8,8 @@ import net.minecraftforge.api.distmarker.OnlyIn;
|
|||
import net.minecraftforge.fml.loading.FMLEnvironment;
|
||||
import net.minecraftforge.network.NetworkEvent;
|
||||
import net.montoyo.wd.controls.builtin.*;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.Log;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
|
@ -32,7 +32,7 @@ public class ScreenControlRegistry {
|
|||
if (FMLEnvironment.dist.isClient()) {
|
||||
boolean shouldThrow = false;
|
||||
try {
|
||||
Method m = type.clazz.getMethod("handleClient", BlockPos.class, BlockSide.class, TileEntityScreen.class, NetworkEvent.Context.class);
|
||||
Method m = type.clazz.getMethod("handleClient", BlockPos.class, BlockSide.class, ScreenBlockEntity.class, NetworkEvent.Context.class);
|
||||
OnlyIn onlyIn = m.getAnnotation(OnlyIn.class);
|
||||
if (onlyIn == null) shouldThrow = true;
|
||||
Dist d = onlyIn.value(); // idc if this throws, lol
|
||||
|
|
|
|||
|
|
@ -9,8 +9,8 @@ import net.minecraftforge.network.NetworkEvent;
|
|||
import net.montoyo.wd.controls.ScreenControl;
|
||||
import net.montoyo.wd.core.MissingPermissionException;
|
||||
import net.montoyo.wd.core.ScreenRights;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
|
|
@ -35,7 +35,7 @@ public class AutoVolumeControl extends ScreenControl {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function<Integer, Boolean> permissionChecker) throws MissingPermissionException {
|
||||
public void handleServer(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx, Function<Integer, Boolean> permissionChecker) throws MissingPermissionException {
|
||||
// I feel like there's probably a better permission category
|
||||
checkPerms(ScreenRights.MANAGE_UPGRADES, permissionChecker, ctx.getSender());
|
||||
tes.setAutoVolume(side, autoVol);
|
||||
|
|
@ -43,7 +43,7 @@ public class AutoVolumeControl extends ScreenControl {
|
|||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx) {
|
||||
public void handleClient(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx) {
|
||||
tes.setAutoVolume(side, autoVol);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,9 +8,9 @@ import net.minecraftforge.api.distmarker.OnlyIn;
|
|||
import net.minecraftforge.network.NetworkEvent;
|
||||
import net.montoyo.wd.controls.ScreenControl;
|
||||
import net.montoyo.wd.core.MissingPermissionException;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.utilities.Vector2i;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.math.Vector2i;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
|
|
@ -47,13 +47,13 @@ public class ClickControl extends ScreenControl {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function<Integer, Boolean> permissionChecker) throws MissingPermissionException {
|
||||
public void handleServer(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx, Function<Integer, Boolean> permissionChecker) throws MissingPermissionException {
|
||||
throw new RuntimeException("Cannot call click control on server");
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx) {
|
||||
public void handleClient(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx) {
|
||||
if (coord != null)
|
||||
tes.handleMouseEvent(side, ClickControl.ControlType.MOVE, coord, -1);
|
||||
|
||||
|
|
|
|||
|
|
@ -10,9 +10,8 @@ import net.minecraftforge.network.NetworkEvent;
|
|||
import net.montoyo.wd.controls.ScreenControl;
|
||||
import net.montoyo.wd.core.JSServerRequest;
|
||||
import net.montoyo.wd.core.MissingPermissionException;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.utilities.Log;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
|
|
@ -49,7 +48,7 @@ public class JSRequestControl extends ScreenControl {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function<Integer, Boolean> permissionChecker) throws MissingPermissionException {
|
||||
public void handleServer(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx, Function<Integer, Boolean> permissionChecker) throws MissingPermissionException {
|
||||
ServerPlayer player = ctx.getSender();
|
||||
// if (reqType == null || data == null) Log.warning("Caught invalid JS request from player %s (UUID %s)", player.getName(), player.getGameProfile().getId().toString());
|
||||
// else tes.handleJSRequest(player, side, reqId, reqType, data);
|
||||
|
|
@ -57,7 +56,7 @@ public class JSRequestControl extends ScreenControl {
|
|||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx) {
|
||||
public void handleClient(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx) {
|
||||
throw new RuntimeException("TODO");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,8 +9,8 @@ import net.minecraftforge.network.NetworkEvent;
|
|||
import net.montoyo.wd.controls.ScreenControl;
|
||||
import net.montoyo.wd.core.MissingPermissionException;
|
||||
import net.montoyo.wd.core.ScreenRights;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
|
|
@ -39,14 +39,14 @@ public class KeyTypedControl extends ScreenControl {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function<Integer, Boolean> permissionChecker) throws MissingPermissionException {
|
||||
public void handleServer(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx, Function<Integer, Boolean> permissionChecker) throws MissingPermissionException {
|
||||
checkPerms(ScreenRights.INTERACT, permissionChecker, ctx.getSender());
|
||||
tes.type(side, text, soundPos, ctx.getSender());
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx) {
|
||||
public void handleClient(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx) {
|
||||
tes.type(side, text, soundPos);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,9 +9,9 @@ import net.minecraftforge.api.distmarker.OnlyIn;
|
|||
import net.minecraftforge.network.NetworkEvent;
|
||||
import net.montoyo.wd.controls.ScreenControl;
|
||||
import net.montoyo.wd.core.MissingPermissionException;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.utilities.Vector2i;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.math.Vector2i;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
|
|
@ -54,7 +54,7 @@ public class LaserControl extends ScreenControl {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function<Integer, Boolean> permissionChecker) throws MissingPermissionException {
|
||||
public void handleServer(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx, Function<Integer, Boolean> permissionChecker) throws MissingPermissionException {
|
||||
// feel like this makes sense, but I wanna get opinions first
|
||||
// checkPerms(ScreenRights.INTERACT, permissionChecker, ctx.getSender());
|
||||
ServerPlayer sender = ctx.getSender();
|
||||
|
|
@ -67,7 +67,7 @@ public class LaserControl extends ScreenControl {
|
|||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx) {
|
||||
public void handleClient(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx) {
|
||||
if (coord != null)
|
||||
tes.handleMouseEvent(side, ClickControl.ControlType.MOVE, coord, -1);
|
||||
|
||||
|
|
|
|||
|
|
@ -11,8 +11,9 @@ import net.minecraftforge.network.NetworkEvent;
|
|||
import net.montoyo.wd.controls.ScreenControl;
|
||||
import net.montoyo.wd.core.MissingPermissionException;
|
||||
import net.montoyo.wd.core.ScreenRights;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.entity.ScreenData;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
|
|
@ -79,7 +80,7 @@ public class ManageRightsAndUpdgradesControl extends ScreenControl {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function<Integer, Boolean> permissionChecker) throws MissingPermissionException {
|
||||
public void handleServer(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx, Function<Integer, Boolean> permissionChecker) throws MissingPermissionException {
|
||||
ServerPlayer player = ctx.getSender();
|
||||
switch (type) {
|
||||
case UPGRADES -> {
|
||||
|
|
@ -89,7 +90,7 @@ public class ManageRightsAndUpdgradesControl extends ScreenControl {
|
|||
else tes.removeUpgrade(side, toRemove, player);
|
||||
}
|
||||
case RIGHTS -> {
|
||||
TileEntityScreen.Screen scr = tes.getScreen(side);
|
||||
ScreenData scr = tes.getScreen(side);
|
||||
|
||||
int fr = scr.owner.uuid.equals(player.getGameProfile().getId()) ? friendRights : scr.friendRights;
|
||||
int or = (scr.rightsFor(player) & ScreenRights.MANAGE_OTHER_RIGHTS) == 0 ? scr.otherRights : otherRights;
|
||||
|
|
@ -102,7 +103,7 @@ public class ManageRightsAndUpdgradesControl extends ScreenControl {
|
|||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx) {
|
||||
public void handleClient(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx) {
|
||||
ServerPlayer player = ctx.getSender();
|
||||
switch (type) {
|
||||
case UPGRADES -> {
|
||||
|
|
@ -111,7 +112,7 @@ public class ManageRightsAndUpdgradesControl extends ScreenControl {
|
|||
else tes.removeUpgrade(side, toRemove, player);
|
||||
}
|
||||
case RIGHTS -> {
|
||||
TileEntityScreen.Screen scr = tes.getScreen(side);
|
||||
ScreenData scr = tes.getScreen(side);
|
||||
|
||||
int fr = friendRights;
|
||||
int or = otherRights;
|
||||
|
|
|
|||
|
|
@ -10,9 +10,9 @@ import net.minecraftforge.network.NetworkEvent;
|
|||
import net.montoyo.wd.controls.ScreenControl;
|
||||
import net.montoyo.wd.core.MissingPermissionException;
|
||||
import net.montoyo.wd.core.ScreenRights;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.utilities.NameUUIDPair;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.serialization.NameUUIDPair;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
|
|
@ -41,7 +41,7 @@ public class ModifyFriendListControl extends ScreenControl {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function<Integer, Boolean> permissionChecker) throws MissingPermissionException {
|
||||
public void handleServer(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx, Function<Integer, Boolean> permissionChecker) throws MissingPermissionException {
|
||||
ServerPlayer player = ctx.getSender();
|
||||
checkPerms(ScreenRights.MANAGE_FRIEND_LIST, permissionChecker, ctx.getSender());
|
||||
if (adding) tes.addFriend(player, side, friend);
|
||||
|
|
@ -50,7 +50,7 @@ public class ModifyFriendListControl extends ScreenControl {
|
|||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx) {
|
||||
public void handleClient(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx) {
|
||||
throw new RuntimeException("TODO");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,9 +8,9 @@ import net.minecraftforge.api.distmarker.OnlyIn;
|
|||
import net.minecraftforge.network.NetworkEvent;
|
||||
import net.montoyo.wd.controls.ScreenControl;
|
||||
import net.montoyo.wd.core.MissingPermissionException;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.utilities.NameUUIDPair;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.serialization.NameUUIDPair;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
|
|
@ -35,13 +35,13 @@ public class OwnerControl extends ScreenControl {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function<Integer, Boolean> permissionChecker) throws MissingPermissionException {
|
||||
public void handleServer(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx, Function<Integer, Boolean> permissionChecker) throws MissingPermissionException {
|
||||
throw new RuntimeException("Cannot handle ownership theft packet from server");
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx) {
|
||||
public void handleClient(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx) {
|
||||
tes.getScreen(side).owner = owner;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,10 +9,10 @@ import net.minecraftforge.network.NetworkEvent;
|
|||
import net.montoyo.wd.controls.ScreenControl;
|
||||
import net.montoyo.wd.core.MissingPermissionException;
|
||||
import net.montoyo.wd.core.ScreenRights;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.utilities.Rotation;
|
||||
import net.montoyo.wd.utilities.Vector2i;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.data.Rotation;
|
||||
import net.montoyo.wd.utilities.math.Vector2i;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
|
|
@ -55,7 +55,7 @@ public class ScreenModifyControl extends ScreenControl {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function<Integer, Boolean> permissionChecker) throws MissingPermissionException {
|
||||
public void handleServer(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx, Function<Integer, Boolean> permissionChecker) throws MissingPermissionException {
|
||||
checkPerms(ScreenRights.MODIFY_SCREEN, permissionChecker, ctx.getSender());
|
||||
switch (type) {
|
||||
case RESOLUTION -> tes.setResolution(side, res);
|
||||
|
|
@ -65,7 +65,7 @@ public class ScreenModifyControl extends ScreenControl {
|
|||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx) {
|
||||
public void handleClient(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx) {
|
||||
switch (type) {
|
||||
case RESOLUTION -> tes.setResolution(side, res);
|
||||
case ROTATION -> tes.setRotation(side, rotation);
|
||||
|
|
|
|||
|
|
@ -9,9 +9,9 @@ import net.minecraftforge.network.NetworkEvent;
|
|||
import net.montoyo.wd.controls.ScreenControl;
|
||||
import net.montoyo.wd.core.MissingPermissionException;
|
||||
import net.montoyo.wd.core.ScreenRights;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.utilities.Vector3i;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.math.Vector3i;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
|
|
@ -41,7 +41,7 @@ public class SetURLControl extends ScreenControl {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function<Integer, Boolean> permissionChecker) throws MissingPermissionException {
|
||||
public void handleServer(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx, Function<Integer, Boolean> permissionChecker) throws MissingPermissionException {
|
||||
// TODO: deal with remote
|
||||
checkPerms(ScreenRights.CHANGE_URL, permissionChecker, ctx.getSender());
|
||||
try {
|
||||
|
|
@ -53,7 +53,7 @@ public class SetURLControl extends ScreenControl {
|
|||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx) {
|
||||
public void handleClient(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx) {
|
||||
try {
|
||||
tes.setScreenURL(side, url);
|
||||
} catch (Throwable err) {
|
||||
|
|
|
|||
|
|
@ -9,9 +9,8 @@ import net.minecraftforge.network.NetworkEvent;
|
|||
import net.montoyo.wd.WebDisplays;
|
||||
import net.montoyo.wd.controls.ScreenControl;
|
||||
import net.montoyo.wd.core.MissingPermissionException;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.utilities.NameUUIDPair;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
|
|
@ -29,13 +28,13 @@ public class TurnOffControl extends ScreenControl {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function<Integer, Boolean> permissionChecker) throws MissingPermissionException {
|
||||
public void handleServer(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx, Function<Integer, Boolean> permissionChecker) throws MissingPermissionException {
|
||||
throw new RuntimeException("Cannot handle deactivation packet from server");
|
||||
}
|
||||
|
||||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx) {
|
||||
public void handleClient(BlockPos pos, BlockSide side, ScreenBlockEntity tes, NetworkEvent.Context ctx) {
|
||||
if (side != null) {
|
||||
WebDisplays.PROXY.closeGui(pos, side);
|
||||
tes.disableScreen(side);
|
||||
|
|
|
|||
|
|
@ -1,24 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2018 BARBOTIN Nicolas
|
||||
*/
|
||||
|
||||
package net.montoyo.wd.core;
|
||||
|
||||
public enum AdvancementIcon {
|
||||
|
||||
WEB_DISPLAYS("wd"),
|
||||
BROKEN_PAD("brokenpad"),
|
||||
PIGEON("pigeon");
|
||||
|
||||
private final String name;
|
||||
|
||||
AdvancementIcon(String n) {
|
||||
name = n;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return name;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -7,6 +7,7 @@ package net.montoyo.wd.core;
|
|||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
// TODO: bring this back when SSR is implemented
|
||||
public class CCArguments implements IComputerArgs {
|
||||
|
||||
private final Object[] args;
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
package net.montoyo.wd.core;
|
||||
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.montoyo.wd.init.ItemInit;
|
||||
import net.montoyo.wd.registry.ItemRegistry;
|
||||
|
||||
public enum CraftComponent {
|
||||
STONEKEY("stonekey", "StoneKey"),
|
||||
|
|
@ -32,6 +32,6 @@ public enum CraftComponent {
|
|||
}
|
||||
|
||||
public ItemStack makeItemStack() {
|
||||
return new ItemStack(ItemInit.getComputerCraftItem(ordinal()).get(), 1);
|
||||
return new ItemStack(ItemRegistry.getComputerCraftItem(ordinal()).get(), 1);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,9 +20,7 @@ import java.util.Arrays;
|
|||
import java.util.HashMap;
|
||||
|
||||
public class Criterion implements CriterionTrigger<Criterion.Instance> {
|
||||
|
||||
public static class Instance extends AbstractCriterionTriggerInstance {
|
||||
|
||||
public Instance(ResourceLocation id, ContextAwarePredicate arg2) {
|
||||
super(id, arg2);
|
||||
}
|
||||
|
|
@ -67,10 +65,9 @@ public class Criterion implements CriterionTrigger<Criterion.Instance> {
|
|||
public void trigger(PlayerAdvancements ply) {
|
||||
ArrayList<Listener<Instance>> listeners = map.get(ply);
|
||||
|
||||
if(listeners != null) {
|
||||
if (listeners != null) {
|
||||
Listener[] copy = listeners.toArray(new Listener[0]); //We need to make a copy, otherwise we get a ConcurrentModificationException
|
||||
Arrays.stream(copy).forEach(l -> l.run(ply));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,23 +8,22 @@ import net.minecraft.util.StringRepresentable;
|
|||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||
import net.montoyo.wd.entity.TileEntityKeyboard;
|
||||
import net.montoyo.wd.entity.TileEntityRCtrl;
|
||||
import net.montoyo.wd.entity.TileEntityRedCtrl;
|
||||
import net.montoyo.wd.entity.TileEntityServer;
|
||||
import net.montoyo.wd.init.BlockInit;
|
||||
import net.montoyo.wd.entity.KeyboardBlockEntity;
|
||||
import net.montoyo.wd.entity.RemoteControlBlockEntity;
|
||||
import net.montoyo.wd.entity.RedstoneControlBlockEntity;
|
||||
import net.montoyo.wd.entity.ServerBlockEntity;
|
||||
import net.montoyo.wd.registry.BlockRegistry;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public enum DefaultPeripheral implements StringRepresentable {
|
||||
|
||||
KEYBOARD("keyboard", "Keyboard", TileEntityKeyboard::new, BlockInit.blockKeyBoard), //WITH FACING (< 3)
|
||||
KEYBOARD("keyboard", "Keyboard", KeyboardBlockEntity::new, BlockRegistry.KEYBOARD_BLOCK), //WITH FACING (< 3)
|
||||
// CC_INTERFACE("ccinterface", "ComputerCraft_Interface", TileEntityCCInterface.class),
|
||||
// OC_INTERFACE("cointerface", "OpenComputers_Interface", TileEntityOCInterface.class),
|
||||
REMOTE_CONTROLLER("remotectrl", "Remote_Controller", TileEntityRCtrl::new ,BlockInit.blockRControl), //WITHOUT FACING (>= 3)
|
||||
REDSTONE_CONTROLLER("redstonectrl", "Redstone_Controller", TileEntityRedCtrl::new ,BlockInit.blockRedControl),
|
||||
SERVER("server", "Server", TileEntityServer::new, BlockInit.blockServer);
|
||||
REMOTE_CONTROLLER("remotectrl", "Remote_Controller", RemoteControlBlockEntity::new , BlockRegistry.REMOTE_CONTROLLER_BLOCK), //WITHOUT FACING (>= 3)
|
||||
REDSTONE_CONTROLLER("redstonectrl", "Redstone_Controller", RedstoneControlBlockEntity::new , BlockRegistry.REDSTONE_CONTROL_BLOCK),
|
||||
SERVER("server", "Server", ServerBlockEntity::new, BlockRegistry.SERVER_BLOCK);
|
||||
|
||||
private final String name;
|
||||
private final String wikiName;
|
||||
|
|
|
|||
|
|
@ -5,9 +5,7 @@
|
|||
package net.montoyo.wd.core;
|
||||
|
||||
public enum HasAdvancement {
|
||||
|
||||
DONT_KNOW,
|
||||
YES,
|
||||
NO
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,10 +7,8 @@ package net.montoyo.wd.core;
|
|||
import java.util.Map;
|
||||
|
||||
public interface IComputerArgs {
|
||||
|
||||
String checkString(int i);
|
||||
int checkInteger(int i);
|
||||
Map checkTable(int i);
|
||||
int count();
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,11 +7,9 @@ package net.montoyo.wd.core;
|
|||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.utilities.Vector3i;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.math.Vector3i;
|
||||
|
||||
public interface IPeripheral {
|
||||
|
||||
boolean connect(Level world, BlockPos blockPos, BlockState blockState, Vector3i screenPos, BlockSide screenSide);
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,14 +6,12 @@
|
|||
//
|
||||
//import net.montoyo.mcef.api.IJSQueryCallback;
|
||||
//import net.montoyo.wd.entity.TileEntityScreen;
|
||||
//import net.montoyo.wd.utilities.BlockSide;
|
||||
//import net.montoyo.wd.utilities.orientation.BlockSide;
|
||||
//
|
||||
//import javax.annotation.Nonnull;
|
||||
//
|
||||
//public interface IScreenQueryHandler {
|
||||
//
|
||||
// //args is an array of Doubles or Strings
|
||||
// //The screen DOES exist, so scr.getScreen(side) is never null
|
||||
// void handleQuery(@Nonnull IJSQueryCallback cb, @Nonnull TileEntityScreen scr, @Nonnull BlockSide side, @Nonnull Object[] args);
|
||||
//
|
||||
//}
|
||||
|
|
|
|||
|
|
@ -6,17 +6,15 @@ package net.montoyo.wd.core;
|
|||
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public interface IUpgrade {
|
||||
|
||||
void onInstall(@Nonnull TileEntityScreen tes, @Nonnull BlockSide screenSide, @Nullable Player player, @Nonnull ItemStack is);
|
||||
boolean onRemove(@Nonnull TileEntityScreen tes, @Nonnull BlockSide screenSide, @Nullable Player player, @Nonnull ItemStack is); //Return true to prevent dropping
|
||||
void onInstall(@Nonnull ScreenBlockEntity tes, @Nonnull BlockSide screenSide, @Nullable Player player, @Nonnull ItemStack is);
|
||||
boolean onRemove(@Nonnull ScreenBlockEntity tes, @Nonnull BlockSide screenSide, @Nullable Player player, @Nonnull ItemStack is); //Return true to prevent dropping
|
||||
boolean isSameUpgrade(@Nonnull ItemStack myStack, @Nonnull ItemStack otherStack); //myStack.getItem() is an instance of this class
|
||||
String getJSName(@Nonnull ItemStack is); //modname:upgradename
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,9 +5,7 @@
|
|||
package net.montoyo.wd.core;
|
||||
|
||||
public interface IWDDCapability {
|
||||
|
||||
boolean isFirstRun();
|
||||
void clearFirstRun();
|
||||
void cloneTo(IWDDCapability dst);
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,10 +5,9 @@
|
|||
package net.montoyo.wd.core;
|
||||
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
import net.montoyo.wd.utilities.Util;
|
||||
import net.montoyo.wd.utilities.serialization.Util;
|
||||
|
||||
public enum JSServerRequest {
|
||||
|
||||
CLEAR_REDSTONE,
|
||||
SET_REDSTONE_AT(Integer.class, Integer.class, Boolean.class);
|
||||
|
||||
|
|
@ -50,5 +49,4 @@ public enum JSServerRequest {
|
|||
|
||||
return ret;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@ package net.montoyo.wd.core;
|
|||
import net.minecraft.server.level.ServerPlayer;
|
||||
|
||||
public class MissingPermissionException extends Exception {
|
||||
|
||||
private final int permission;
|
||||
private final ServerPlayer player;
|
||||
|
||||
|
|
@ -24,5 +23,4 @@ public class MissingPermissionException extends Exception {
|
|||
public ServerPlayer getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@ import java.util.Optional;
|
|||
|
||||
@Optional.Interface(iface = "net.montoyo.wd.core.IComputerArgs", modid = "opencomputers")
|
||||
public class OCArguments implements IComputerArgs {
|
||||
|
||||
//Keep this as an "Object" so that it doesn't crash if OC is absent
|
||||
private final Object args;
|
||||
|
||||
|
|
@ -41,5 +40,4 @@ public class OCArguments implements IComputerArgs {
|
|||
public int count() {
|
||||
return ((Arguments) args).count();
|
||||
}
|
||||
|
||||
} */
|
||||
|
|
|
|||
|
|
@ -5,9 +5,10 @@
|
|||
package net.montoyo.wd.core;
|
||||
|
||||
public abstract class ScreenRights {
|
||||
|
||||
public static final int CHANGE_URL = 1; //Change URL AND run JavaScript
|
||||
/** use {@link ScreenRights#INTERACT instead} */
|
||||
/**
|
||||
* use {@link ScreenRights#INTERACT instead}
|
||||
*/
|
||||
@Deprecated(forRemoval = true)
|
||||
public static final int CLICK = 2; //Click AND type
|
||||
public static final int INTERACT = 2; //Click AND type
|
||||
|
|
@ -21,5 +22,4 @@ public abstract class ScreenRights {
|
|||
public static final int NONE = 0;
|
||||
public static final int ALL = 0xFF;
|
||||
public static final int DEFAULTS = CHANGE_URL | INTERACT | MANAGE_UPGRADES | MODIFY_SCREEN;
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,14 +18,11 @@ import javax.annotation.Nonnull;
|
|||
import java.util.concurrent.Callable;
|
||||
|
||||
public class WDDCapability implements IWDDCapability {
|
||||
|
||||
public static class Factory implements Callable<IWDDCapability> {
|
||||
|
||||
@Override
|
||||
public IWDDCapability call() {
|
||||
return new WDDCapability();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class Provider implements ICapabilitySerializable<CompoundTag> {
|
||||
|
|
@ -38,7 +35,7 @@ public class WDDCapability implements IWDDCapability {
|
|||
@NotNull
|
||||
@Override
|
||||
public <T> LazyOptional<T> getCapability(@NotNull Capability<T> capability, @org.jetbrains.annotations.Nullable Direction arg) {
|
||||
return cap == capability ? INSTANCE.cast() : LazyOptional.empty();
|
||||
return cap == capability ? INSTANCE.cast() : LazyOptional.empty();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -78,8 +75,7 @@ public class WDDCapability implements IWDDCapability {
|
|||
|
||||
@Override
|
||||
public void cloneTo(IWDDCapability dst) {
|
||||
if(!isFirstRun())
|
||||
if (!isFirstRun())
|
||||
dst.clearFirstRun();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,53 +18,54 @@ import java.util.HashMap;
|
|||
import java.util.function.Supplier;
|
||||
|
||||
public abstract class GuiData {
|
||||
public static GuiData read(String name, FriendlyByteBuf buf) {
|
||||
GuiType type = dataTable.get(name);
|
||||
GuiData data = type.create();
|
||||
data.deserialize(buf);
|
||||
return data;
|
||||
}
|
||||
|
||||
protected static class GuiType {
|
||||
Class<? extends GuiData> clazz;
|
||||
Supplier<GuiData> constructor;
|
||||
|
||||
public GuiType(Class<? extends GuiData> clazz, Supplier<GuiData> constructor) {
|
||||
this.clazz = clazz;
|
||||
this.constructor = constructor;
|
||||
}
|
||||
|
||||
public GuiData create() {
|
||||
return constructor.get();
|
||||
}
|
||||
}
|
||||
|
||||
private static final HashMap<String, GuiType> dataTable = new HashMap<>();
|
||||
|
||||
static {
|
||||
dataTable.put("SetURL", new GuiType(SetURLData.class, SetURLData::new));
|
||||
dataTable.put("ScreenConfig", new GuiType(ScreenConfigData.class, ScreenConfigData::new));
|
||||
dataTable.put("Keyboard", new GuiType(KeyboardData.class, KeyboardData::new));
|
||||
dataTable.put("RedstoneCtrl", new GuiType(RedstoneCtrlData.class, RedstoneCtrlData::new));
|
||||
dataTable.put("Server", new GuiType(ServerData.class, ServerData::new));
|
||||
}
|
||||
|
||||
public static Class<? extends GuiData> classOf(String name) {
|
||||
return dataTable.get(name).clazz;
|
||||
}
|
||||
|
||||
public GuiData() {
|
||||
}
|
||||
public static GuiData read(String name, FriendlyByteBuf buf) {
|
||||
GuiType type = dataTable.get(name);
|
||||
GuiData data = type.create();
|
||||
data.deserialize(buf);
|
||||
return data;
|
||||
}
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public abstract Screen createGui(Screen old, Level world);
|
||||
|
||||
public abstract String getName();
|
||||
|
||||
public void sendTo(ServerPlayer player) {
|
||||
WDNetworkRegistry.INSTANCE.send(PacketDistributor.PLAYER.with(() -> player), new S2CMessageOpenGui(this));
|
||||
}
|
||||
protected static class GuiType {
|
||||
Class<? extends GuiData> clazz;
|
||||
Supplier<GuiData> constructor;
|
||||
|
||||
public GuiType(Class<? extends GuiData> clazz, Supplier<GuiData> constructor) {
|
||||
this.clazz = clazz;
|
||||
this.constructor = constructor;
|
||||
}
|
||||
|
||||
public GuiData create() {
|
||||
return constructor.get();
|
||||
}
|
||||
}
|
||||
|
||||
private static final HashMap<String, GuiType> dataTable = new HashMap<>();
|
||||
|
||||
static {
|
||||
dataTable.put("SetURL", new GuiType(SetURLData.class, SetURLData::new));
|
||||
dataTable.put("ScreenConfig", new GuiType(ScreenConfigData.class, ScreenConfigData::new));
|
||||
dataTable.put("Keyboard", new GuiType(KeyboardData.class, KeyboardData::new));
|
||||
dataTable.put("RedstoneCtrl", new GuiType(RedstoneCtrlData.class, RedstoneCtrlData::new));
|
||||
dataTable.put("Server", new GuiType(ServerData.class, ServerData::new));
|
||||
}
|
||||
|
||||
public static Class<? extends GuiData> classOf(String name) {
|
||||
return dataTable.get(name).clazz;
|
||||
}
|
||||
|
||||
public GuiData() {
|
||||
}
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public abstract Screen createGui(Screen old, Level world);
|
||||
|
||||
public abstract String getName();
|
||||
|
||||
public void sendTo(ServerPlayer player) {
|
||||
WDNetworkRegistry.INSTANCE.send(PacketDistributor.PLAYER.with(() -> player), new S2CMessageOpenGui(this));
|
||||
}
|
||||
|
||||
public abstract void serialize(FriendlyByteBuf buf);
|
||||
|
||||
public abstract void deserialize(FriendlyByteBuf buf);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,23 +12,22 @@ import net.minecraft.world.level.block.entity.BlockEntity;
|
|||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.montoyo.wd.client.gui.GuiKeyboard;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.Log;
|
||||
import net.montoyo.wd.utilities.Vector3i;
|
||||
import net.montoyo.wd.utilities.math.Vector3i;
|
||||
|
||||
public class KeyboardData extends GuiData {
|
||||
|
||||
public Vector3i pos;
|
||||
public BlockSide side;
|
||||
public int kbX;
|
||||
public int kbY;
|
||||
public int kbZ;
|
||||
|
||||
|
||||
public KeyboardData() {
|
||||
}
|
||||
|
||||
public KeyboardData(TileEntityScreen tes, BlockSide side, BlockPos kbPos) {
|
||||
|
||||
public KeyboardData(ScreenBlockEntity tes, BlockSide side, BlockPos kbPos) {
|
||||
pos = new Vector3i(tes.getBlockPos());
|
||||
this.side = side;
|
||||
kbX = kbPos.getX();
|
||||
|
|
@ -40,19 +39,19 @@ public class KeyboardData extends GuiData {
|
|||
@Override
|
||||
public Screen createGui(Screen old, Level world) {
|
||||
BlockEntity te = world.getBlockEntity(pos.toBlock());
|
||||
if(te == null || !(te instanceof TileEntityScreen)) {
|
||||
if (te == null || !(te instanceof ScreenBlockEntity)) {
|
||||
Log.error("TileEntity at %s is not a screen; can't open keyboard!", pos.toString());
|
||||
return null;
|
||||
}
|
||||
|
||||
return new GuiKeyboard((TileEntityScreen) te, side, new BlockPos(kbX, kbY, kbZ));
|
||||
return new GuiKeyboard((ScreenBlockEntity) te, side, new BlockPos(kbX, kbY, kbZ));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "Keyboard";
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void serialize(FriendlyByteBuf buf) {
|
||||
buf.writeInt(pos.x);
|
||||
|
|
|
|||
|
|
@ -13,19 +13,18 @@ import net.minecraftforge.api.distmarker.Dist;
|
|||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.montoyo.wd.client.gui.GuiRedstoneCtrl;
|
||||
import net.montoyo.wd.net.BufferUtils;
|
||||
import net.montoyo.wd.utilities.Vector3i;
|
||||
import net.montoyo.wd.utilities.math.Vector3i;
|
||||
|
||||
public class RedstoneCtrlData extends GuiData {
|
||||
|
||||
public ResourceLocation dimension;
|
||||
public Vector3i pos;
|
||||
public String risingEdgeURL;
|
||||
public String fallingEdgeURL;
|
||||
|
||||
|
||||
public RedstoneCtrlData() {
|
||||
super();
|
||||
}
|
||||
|
||||
|
||||
public RedstoneCtrlData(ResourceLocation d, BlockPos p, String r, String f) {
|
||||
dimension = d;
|
||||
pos = new Vector3i(p);
|
||||
|
|
@ -43,7 +42,7 @@ public class RedstoneCtrlData extends GuiData {
|
|||
public String getName() {
|
||||
return "RedstoneCtrl";
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void serialize(FriendlyByteBuf buf) {
|
||||
buf.writeUtf(dimension.toString());
|
||||
|
|
@ -51,7 +50,7 @@ public class RedstoneCtrlData extends GuiData {
|
|||
buf.writeUtf(risingEdgeURL);
|
||||
buf.writeUtf(fallingEdgeURL);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void deserialize(FriendlyByteBuf buf) {
|
||||
dimension = new ResourceLocation(buf.readUtf());
|
||||
|
|
|
|||
|
|
@ -13,28 +13,28 @@ import net.minecraftforge.api.distmarker.Dist;
|
|||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.minecraftforge.network.PacketDistributor;
|
||||
import net.montoyo.wd.client.gui.GuiScreenConfig;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.entity.ScreenData;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.net.BufferUtils;
|
||||
import net.montoyo.wd.net.WDNetworkRegistry;
|
||||
import net.montoyo.wd.net.client_bound.S2CMessageOpenGui;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.Log;
|
||||
import net.montoyo.wd.utilities.NameUUIDPair;
|
||||
import net.montoyo.wd.utilities.Vector3i;
|
||||
import net.montoyo.wd.utilities.serialization.NameUUIDPair;
|
||||
import net.montoyo.wd.utilities.math.Vector3i;
|
||||
|
||||
public class ScreenConfigData extends GuiData {
|
||||
|
||||
public boolean onlyUpdate;
|
||||
public Vector3i pos;
|
||||
public BlockSide side;
|
||||
public NameUUIDPair[] friends;
|
||||
public int friendRights;
|
||||
public int otherRights;
|
||||
|
||||
public ScreenConfigData() {
|
||||
}
|
||||
public boolean onlyUpdate;
|
||||
public Vector3i pos;
|
||||
public BlockSide side;
|
||||
public NameUUIDPair[] friends;
|
||||
public int friendRights;
|
||||
public int otherRights;
|
||||
|
||||
public ScreenConfigData(Vector3i pos, BlockSide side, TileEntityScreen.Screen scr) {
|
||||
public ScreenConfigData() {
|
||||
}
|
||||
|
||||
public ScreenConfigData(Vector3i pos, BlockSide side, ScreenData scr) {
|
||||
this.pos = pos;
|
||||
this.side = side;
|
||||
friends = scr.friends.toArray(new NameUUIDPair[0]);
|
||||
|
|
@ -63,12 +63,12 @@ public class ScreenConfigData extends GuiData {
|
|||
return null;
|
||||
|
||||
BlockEntity te = world.getBlockEntity(pos.toBlock());
|
||||
if (te == null || !(te instanceof TileEntityScreen)) {
|
||||
if (te == null || !(te instanceof ScreenBlockEntity)) {
|
||||
Log.error("TileEntity at %s is not a screen; can't open gui!", pos.toString());
|
||||
return null;
|
||||
}
|
||||
|
||||
return new GuiScreenConfig(Component.nullToEmpty(""), (TileEntityScreen) te, side, friends, friendRights, otherRights);
|
||||
return new GuiScreenConfig(Component.nullToEmpty(""), (ScreenBlockEntity) te, side, friends, friendRights, otherRights);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -12,17 +12,16 @@ import net.minecraftforge.api.distmarker.Dist;
|
|||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.montoyo.wd.client.gui.GuiServer;
|
||||
import net.montoyo.wd.net.BufferUtils;
|
||||
import net.montoyo.wd.utilities.NameUUIDPair;
|
||||
import net.montoyo.wd.utilities.Vector3i;
|
||||
import net.montoyo.wd.utilities.serialization.NameUUIDPair;
|
||||
import net.montoyo.wd.utilities.math.Vector3i;
|
||||
|
||||
public class ServerData extends GuiData {
|
||||
|
||||
public Vector3i pos;
|
||||
public NameUUIDPair owner;
|
||||
|
||||
|
||||
public ServerData() {
|
||||
}
|
||||
|
||||
|
||||
public ServerData(BlockPos bp, NameUUIDPair owner) {
|
||||
pos = new Vector3i(bp);
|
||||
this.owner = owner;
|
||||
|
|
@ -38,13 +37,13 @@ public class ServerData extends GuiData {
|
|||
public String getName() {
|
||||
return "Server";
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void serialize(FriendlyByteBuf buf) {
|
||||
BufferUtils.writeVec3i(buf, pos);
|
||||
owner.writeTo(buf);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void deserialize(FriendlyByteBuf buf) {
|
||||
pos = BufferUtils.readVec3i(buf);
|
||||
|
|
|
|||
|
|
@ -12,23 +12,22 @@ import net.minecraft.world.level.block.entity.BlockEntity;
|
|||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.montoyo.wd.client.gui.GuiSetURL2;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.net.BufferUtils;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.Log;
|
||||
import net.montoyo.wd.utilities.Vector3i;
|
||||
import net.montoyo.wd.utilities.math.Vector3i;
|
||||
|
||||
public class SetURLData extends GuiData {
|
||||
|
||||
public Vector3i pos;
|
||||
public BlockSide side;
|
||||
public String url;
|
||||
public boolean isRemote;
|
||||
public Vector3i remoteLocation;
|
||||
|
||||
|
||||
public SetURLData() {
|
||||
}
|
||||
|
||||
|
||||
public SetURLData(Vector3i pos, BlockSide side, String url) {
|
||||
this.pos = pos;
|
||||
this.side = side;
|
||||
|
|
@ -50,19 +49,19 @@ public class SetURLData extends GuiData {
|
|||
@Override
|
||||
public Screen createGui(Screen old, Level world) {
|
||||
BlockEntity te = world.getBlockEntity(pos.toBlock());
|
||||
if(te == null || !(te instanceof TileEntityScreen)) {
|
||||
if (te == null || !(te instanceof ScreenBlockEntity)) {
|
||||
Log.error("TileEntity at %s is not a screen; can't open gui!", pos.toString());
|
||||
return null;
|
||||
}
|
||||
|
||||
return new GuiSetURL2((TileEntityScreen) te, side, url, isRemote ? remoteLocation : null);
|
||||
return new GuiSetURL2((ScreenBlockEntity) te, side, url, isRemote ? remoteLocation : null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "SetURL";
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void serialize(FriendlyByteBuf buf) {
|
||||
BufferUtils.writeVec3i(buf, pos);
|
||||
|
|
@ -71,7 +70,7 @@ public class SetURLData extends GuiData {
|
|||
buf.writeBoolean(isRemote);
|
||||
if (isRemote) BufferUtils.writeVec3i(buf, remoteLocation);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void deserialize(FriendlyByteBuf buf) {
|
||||
pos = BufferUtils.readVec3i(buf);
|
||||
|
|
|
|||
|
|
@ -13,7 +13,11 @@ import net.montoyo.wd.WebDisplays;
|
|||
import net.montoyo.wd.core.IComputerArgs;
|
||||
import net.montoyo.wd.core.IUpgrade;
|
||||
import net.montoyo.wd.core.ScreenRights;
|
||||
import net.montoyo.wd.utilities.*;
|
||||
import net.montoyo.wd.utilities.math.Vector2i;
|
||||
import net.montoyo.wd.utilities.data.Rotation;
|
||||
import net.montoyo.wd.utilities.serialization.NameUUIDPair;
|
||||
import net.montoyo.wd.utilities.serialization.TypeData;
|
||||
import net.montoyo.wd.utilities.serialization.Util;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.annotation.ElementType;
|
||||
|
|
@ -23,9 +27,8 @@ import java.lang.annotation.Target;
|
|||
import java.util.ArrayList;
|
||||
import java.util.Map;
|
||||
|
||||
public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase {
|
||||
|
||||
public TileEntityInterfaceBase(BlockEntityType<?> arg, BlockPos arg2, BlockState arg3) {
|
||||
public abstract class AbstractInterfaceBlockEntity extends AbstractPeripheralBlockEntity {
|
||||
public AbstractInterfaceBlockEntity(BlockEntityType<?> arg, BlockPos arg2, BlockState arg3) {
|
||||
super(arg, arg2, arg3);
|
||||
}
|
||||
|
||||
|
|
@ -108,7 +111,7 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase {
|
|||
throw new IllegalArgumentException("invalid right name");
|
||||
}
|
||||
|
||||
TileEntityScreen tes = getConnectedScreenEx();
|
||||
ScreenBlockEntity tes = getConnectedScreenEx();
|
||||
if(owner == null || tes == null)
|
||||
return null;
|
||||
else
|
||||
|
|
@ -119,7 +122,7 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase {
|
|||
public Object[] hasUpgrade(IComputerArgs args) {
|
||||
String name = args.checkString(0);
|
||||
|
||||
TileEntityScreen tes = getConnectedScreenEx();
|
||||
ScreenBlockEntity tes = getConnectedScreenEx();
|
||||
if(owner == null || tes == null)
|
||||
return null;
|
||||
else
|
||||
|
|
@ -128,7 +131,7 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase {
|
|||
|
||||
@ComputerFunc
|
||||
public Object[] getSize(IComputerArgs args) {
|
||||
TileEntityScreen tes = getConnectedScreenEx();
|
||||
ScreenBlockEntity tes = getConnectedScreenEx();
|
||||
|
||||
if(owner == null || tes == null)
|
||||
return null;
|
||||
|
|
@ -140,7 +143,7 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase {
|
|||
|
||||
@ComputerFunc
|
||||
public Object[] getResolution(IComputerArgs args) {
|
||||
TileEntityScreen tes = getConnectedScreenEx();
|
||||
ScreenBlockEntity tes = getConnectedScreenEx();
|
||||
|
||||
if(owner == null || tes == null)
|
||||
return null;
|
||||
|
|
@ -152,7 +155,7 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase {
|
|||
|
||||
@ComputerFunc
|
||||
public Object[] getRotation(IComputerArgs args) {
|
||||
TileEntityScreen tes = getConnectedScreenEx();
|
||||
ScreenBlockEntity tes = getConnectedScreenEx();
|
||||
|
||||
if(owner == null || tes == null)
|
||||
return null;
|
||||
|
|
@ -162,7 +165,7 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase {
|
|||
|
||||
@ComputerFunc
|
||||
public Object[] getURL(IComputerArgs args) {
|
||||
TileEntityScreen tes = getConnectedScreenEx();
|
||||
ScreenBlockEntity tes = getConnectedScreenEx();
|
||||
|
||||
if(owner == null || tes == null)
|
||||
return null;
|
||||
|
|
@ -206,12 +209,12 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase {
|
|||
// throw new IllegalArgumentException("bad action name");
|
||||
// }
|
||||
|
||||
TileEntityScreen scr = getConnectedScreenEx();
|
||||
ScreenBlockEntity scr = getConnectedScreenEx();
|
||||
|
||||
if(owner == null || scr == null)
|
||||
return err("notlinked");
|
||||
else {
|
||||
TileEntityScreen.Screen scrscr = scr.getScreen(screenSide);
|
||||
ScreenData scrscr = scr.getScreen(screenSide);
|
||||
|
||||
if((scrscr.rightsFor(owner.uuid) & ScreenRights.INTERACT) == 0)
|
||||
return err("restrictions");
|
||||
|
|
@ -245,7 +248,7 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase {
|
|||
}
|
||||
|
||||
private Object[] realType(String what) {
|
||||
TileEntityScreen scr = getConnectedScreenEx();
|
||||
ScreenBlockEntity scr = getConnectedScreenEx();
|
||||
|
||||
if(owner == null || scr == null)
|
||||
return err("notlinked");
|
||||
|
|
@ -326,7 +329,7 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase {
|
|||
@ComputerFunc
|
||||
public Object[] setURL(IComputerArgs args) {
|
||||
String url = args.checkString(0);
|
||||
TileEntityScreen scr = getConnectedScreenEx();
|
||||
ScreenBlockEntity scr = getConnectedScreenEx();
|
||||
|
||||
if(owner == null || scr == null)
|
||||
return err("notlinked");
|
||||
|
|
@ -346,7 +349,7 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase {
|
|||
public Object[] setResolution(IComputerArgs args) {
|
||||
int rx = args.checkInteger(0);
|
||||
int ry = args.checkInteger(1);
|
||||
TileEntityScreen scr = getConnectedScreenEx();
|
||||
ScreenBlockEntity scr = getConnectedScreenEx();
|
||||
|
||||
if(owner == null || scr == null)
|
||||
return err("notlinked");
|
||||
|
|
@ -369,7 +372,7 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase {
|
|||
rot /= 90;
|
||||
rot &= 3;
|
||||
|
||||
TileEntityScreen scr = getConnectedScreenEx();
|
||||
ScreenBlockEntity scr = getConnectedScreenEx();
|
||||
|
||||
if(owner == null || scr == null)
|
||||
return err("notlinked");
|
||||
|
|
@ -384,7 +387,7 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase {
|
|||
@ComputerFunc
|
||||
public Object[] runJS(IComputerArgs args) {
|
||||
String code = args.checkString(0);
|
||||
TileEntityScreen scr = getConnectedScreenEx();
|
||||
ScreenBlockEntity scr = getConnectedScreenEx();
|
||||
|
||||
if(owner == null || scr == null)
|
||||
return err("notlinked");
|
||||
|
|
@ -406,5 +409,4 @@ public abstract class TileEntityInterfaceBase extends TileEntityPeripheralBase {
|
|||
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -16,29 +16,28 @@ import net.minecraft.world.level.block.entity.BlockEntityType;
|
|||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.chunk.LevelChunk;
|
||||
import net.montoyo.wd.core.IPeripheral;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.Log;
|
||||
import net.montoyo.wd.utilities.Vector3i;
|
||||
import net.montoyo.wd.utilities.math.Vector3i;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.Objects;
|
||||
|
||||
public abstract class TileEntityPeripheralBase extends BlockEntity implements IPeripheral {
|
||||
|
||||
public abstract class AbstractPeripheralBlockEntity extends BlockEntity implements IPeripheral {
|
||||
protected Vector3i screenPos;
|
||||
protected BlockSide screenSide;
|
||||
|
||||
public TileEntityPeripheralBase(BlockEntityType<?> arg, BlockPos arg2, BlockState arg3) {
|
||||
public AbstractPeripheralBlockEntity(BlockEntityType<?> arg, BlockPos arg2, BlockState arg3) {
|
||||
super(arg, arg2, arg3);
|
||||
}
|
||||
|
||||
|
||||
// TODO
|
||||
@Override
|
||||
public void load(CompoundTag tag) {
|
||||
super.load(tag);
|
||||
|
||||
if(tag.contains("WDScreen", 10)) {
|
||||
|
||||
if (tag.contains("WDScreen", 10)) {
|
||||
CompoundTag scr = tag.getCompound("WDScreen");
|
||||
screenPos = new Vector3i(scr.getInt("X"), scr.getInt("Y"), scr.getInt("Z"));
|
||||
screenSide = BlockSide.values()[scr.getByte("Side")];
|
||||
|
|
@ -47,28 +46,28 @@ public abstract class TileEntityPeripheralBase extends BlockEntity implements IP
|
|||
screenSide = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void saveAdditional(CompoundTag tag) {
|
||||
super.saveAdditional(tag);
|
||||
|
||||
if(screenPos != null && screenSide != null) {
|
||||
|
||||
if (screenPos != null && screenSide != null) {
|
||||
CompoundTag scr = new CompoundTag();
|
||||
scr.putInt("X", screenPos.x);
|
||||
scr.putInt("Y", screenPos.y);
|
||||
scr.putInt("Z", screenPos.z);
|
||||
scr.putByte("Side", (byte) screenSide.ordinal());
|
||||
|
||||
|
||||
tag.put("WDScreen", scr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// this is not used for loading from disk, so I'm marking it final
|
||||
@Override
|
||||
public final void deserializeNBT(CompoundTag tag) {
|
||||
super.deserializeNBT(tag);
|
||||
}
|
||||
|
||||
|
||||
// this is not used for writing to disk, so I'm marking it final
|
||||
@Override
|
||||
@Nonnull
|
||||
|
|
@ -79,12 +78,12 @@ public abstract class TileEntityPeripheralBase extends BlockEntity implements IP
|
|||
@Override
|
||||
public boolean connect(Level world_, BlockPos blockPos, BlockState blockState, Vector3i pos, BlockSide side) {
|
||||
BlockEntity te = world_.getBlockEntity(pos.toBlock());
|
||||
if(te == null || !(te instanceof TileEntityScreen)) {
|
||||
if (!(te instanceof ScreenBlockEntity)) {
|
||||
Log.error("TileEntityPeripheralBase.connect(): Tile entity at %s is not a screen!", pos.toString());
|
||||
return false;
|
||||
}
|
||||
|
||||
if(((TileEntityScreen) te).getScreen(side) == null) {
|
||||
if (((ScreenBlockEntity) te).getScreen(side) == null) {
|
||||
Log.error("TileEntityPeripheralBase.connect(): There is no screen at %s on side %s!", pos.toString(), side.toString());
|
||||
return false;
|
||||
}
|
||||
|
|
@ -108,31 +107,31 @@ public abstract class TileEntityPeripheralBase extends BlockEntity implements IP
|
|||
}
|
||||
|
||||
@Nullable
|
||||
public TileEntityScreen getConnectedScreen() {
|
||||
if(screenPos == null || screenSide == null)
|
||||
public ScreenBlockEntity getConnectedScreen() {
|
||||
if (screenPos == null || screenSide == null)
|
||||
return null;
|
||||
|
||||
BlockEntity te = level.getBlockEntity(screenPos.toBlock());
|
||||
if(te == null || !(te instanceof TileEntityScreen) || ((TileEntityScreen) te).getScreen(screenSide) == null) {
|
||||
if (!(te instanceof ScreenBlockEntity) || ((ScreenBlockEntity) te).getScreen(screenSide) == null) {
|
||||
screenPos = null;
|
||||
screenSide = null;
|
||||
setChanged();
|
||||
return null;
|
||||
}
|
||||
|
||||
return (TileEntityScreen) te;
|
||||
return (ScreenBlockEntity) te;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public TileEntityScreen getConnectedScreenEx() {
|
||||
if(screenPos == null || screenSide == null)
|
||||
public ScreenBlockEntity getConnectedScreenEx() {
|
||||
if (screenPos == null || screenSide == null)
|
||||
return null;
|
||||
|
||||
BlockEntity te = level.getBlockEntity(screenPos.toBlock());
|
||||
if(te == null || !(te instanceof TileEntityScreen) || ((TileEntityScreen) te).getScreen(screenSide) == null)
|
||||
if (!(te instanceof ScreenBlockEntity) || ((ScreenBlockEntity) te).getScreen(screenSide) == null)
|
||||
return null;
|
||||
|
||||
return (TileEntityScreen) te;
|
||||
return (ScreenBlockEntity) te;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
|
|
@ -3,6 +3,7 @@
|
|||
*/
|
||||
|
||||
package net.montoyo.wd.entity;
|
||||
|
||||
/*
|
||||
import dan200.computercraft.api.lua.ILuaContext;
|
||||
import dan200.computercraft.api.lua.LuaException;
|
||||
|
|
@ -19,18 +20,17 @@ import java.lang.reflect.Method;
|
|||
import java.util.ArrayList;
|
||||
|
||||
@Optional.Interface(iface = "dan200.computercraft.api.peripheral.IPeripheral", modid = "computercraft")
|
||||
public class TileEntityCCInterface extends TileEntityInterfaceBase implements IPeripheral {
|
||||
|
||||
public class CCInterfaceBlockEntity extends AbstractInterfaceBlockEntity implements IPeripheral {
|
||||
private static final String[] METHOD_NAMES;
|
||||
private static final Method[] METHODS;
|
||||
|
||||
static {
|
||||
ArrayList<String> names = new ArrayList<>();
|
||||
ArrayList<Method> methods = new ArrayList<>();
|
||||
Method[] src = TileEntityInterfaceBase.class.getMethods();
|
||||
Method[] src = AbstractInterfaceBlockEntity.class.getMethods();
|
||||
|
||||
for(Method m: src) {
|
||||
if(m.getAnnotation(TileEntityInterfaceBase.ComputerFunc.class) != null) {
|
||||
if(m.getAnnotation(AbstractInterfaceBlockEntity.ComputerFunc.class) != null) {
|
||||
if(m.getParameterCount() != 1 || m.getParameterTypes()[0] != IComputerArgs.class)
|
||||
throw new RuntimeException("Found @ComputerFunc method with invalid arguments");
|
||||
|
||||
|
|
@ -79,5 +79,4 @@ public class TileEntityCCInterface extends TileEntityInterfaceBase implements IP
|
|||
public boolean equals(@Nullable IPeripheral periph) {
|
||||
return periph == this;
|
||||
}
|
||||
|
||||
}*/
|
||||
|
|
@ -15,15 +15,14 @@ import net.minecraft.world.level.block.state.BlockState;
|
|||
import net.montoyo.wd.WebDisplays;
|
||||
import net.montoyo.wd.core.ScreenRights;
|
||||
import net.montoyo.wd.data.KeyboardData;
|
||||
import net.montoyo.wd.init.TileInit;
|
||||
import net.montoyo.wd.utilities.Util;
|
||||
|
||||
public class TileEntityKeyboard extends TileEntityPeripheralBase {
|
||||
import net.montoyo.wd.registry.TileRegistry;
|
||||
import net.montoyo.wd.utilities.serialization.Util;
|
||||
|
||||
public class KeyboardBlockEntity extends AbstractPeripheralBlockEntity {
|
||||
private static final String RANDOM_CHARS = "AZERTYUIOPQSDFGHJKLMWXCVBNazertyuiopqsdfghjklmwxcvbn0123456789"; //Yes I have an AZERTY keyboard, u care?
|
||||
|
||||
public TileEntityKeyboard(BlockPos arg2, BlockState arg3) {
|
||||
super(TileInit.KEYBOARD.get(), arg2, arg3);
|
||||
public KeyboardBlockEntity(BlockPos arg2, BlockState arg3) {
|
||||
super(TileRegistry.KEYBOARD.get(), arg2, arg3);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -36,13 +35,13 @@ public class TileEntityKeyboard extends TileEntityPeripheralBase {
|
|||
return InteractionResult.SUCCESS;
|
||||
}
|
||||
|
||||
TileEntityScreen tes = getConnectedScreen();
|
||||
ScreenBlockEntity tes = getConnectedScreen();
|
||||
if(tes == null) {
|
||||
Util.toast(player, "notLinked");
|
||||
return InteractionResult.SUCCESS;
|
||||
}
|
||||
|
||||
TileEntityScreen.Screen scr = tes.getScreen(screenSide);
|
||||
ScreenData scr = tes.getScreen(screenSide);
|
||||
if((scr.rightsFor(player) & ScreenRights.INTERACT) == 0) {
|
||||
Util.toast(player, "restrictions");
|
||||
return InteractionResult.SUCCESS;
|
||||
|
|
@ -56,10 +55,10 @@ public class TileEntityKeyboard extends TileEntityPeripheralBase {
|
|||
if(!isScreenChunkLoaded())
|
||||
return;
|
||||
|
||||
TileEntityScreen tes = getConnectedScreen();
|
||||
ScreenBlockEntity tes = getConnectedScreen();
|
||||
|
||||
if(tes != null) {
|
||||
TileEntityScreen.Screen scr = tes.getScreen(screenSide);
|
||||
ScreenData scr = tes.getScreen(screenSide);
|
||||
boolean ok;
|
||||
|
||||
if(ent instanceof Player)
|
||||
|
|
@ -72,10 +71,9 @@ public class TileEntityKeyboard extends TileEntityPeripheralBase {
|
|||
tes.type(screenSide, "t" + rnd, getBlockPos());
|
||||
|
||||
Player owner = level.getPlayerByUUID(scr.owner.uuid);
|
||||
if(owner != null && owner instanceof ServerPlayer && ent instanceof Ocelot)
|
||||
if(owner instanceof ServerPlayer && ent instanceof Ocelot)
|
||||
WebDisplays.INSTANCE.criterionKeyboardCat.trigger(((ServerPlayer) owner).getAdvancements());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -13,8 +13,7 @@ import net.minecraftforge.fml.common.Optional;
|
|||
import net.montoyo.wd.core.OCArguments;
|
||||
|
||||
@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "opencomputers")
|
||||
public class TileEntityOCInterface extends TileEntityInterfaceBase implements SimpleComponent {
|
||||
|
||||
public class OCInterfaceBlockEntity extends AbstractInterfaceBlockEntity implements SimpleComponent {
|
||||
@Override
|
||||
public String getComponentName() {
|
||||
return "webdisplays";
|
||||
|
|
@ -133,5 +132,4 @@ public class TileEntityOCInterface extends TileEntityInterfaceBase implements Si
|
|||
public Object[] unlink(Context ctx, Arguments args) {
|
||||
return unlink(new OCArguments(args));
|
||||
}
|
||||
|
||||
}*/
|
||||
|
|
@ -14,30 +14,29 @@ import net.minecraft.world.level.block.Block;
|
|||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.montoyo.wd.core.ScreenRights;
|
||||
import net.montoyo.wd.data.RedstoneCtrlData;
|
||||
import net.montoyo.wd.init.TileInit;
|
||||
import net.montoyo.wd.utilities.Util;
|
||||
import net.montoyo.wd.registry.TileRegistry;
|
||||
import net.montoyo.wd.utilities.serialization.Util;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class TileEntityRedCtrl extends TileEntityPeripheralBase {
|
||||
|
||||
public class RedstoneControlBlockEntity extends AbstractPeripheralBlockEntity {
|
||||
private String risingEdgeURL = "";
|
||||
private String fallingEdgeURL = "";
|
||||
private boolean state = false;
|
||||
|
||||
public TileEntityRedCtrl(BlockPos arg2, BlockState arg3) {
|
||||
super(TileInit.REDSTONE_CONTROLLER.get(), arg2, arg3);
|
||||
public RedstoneControlBlockEntity(BlockPos arg2, BlockState arg3) {
|
||||
super(TileRegistry.REDSTONE_CONTROLLER.get(), arg2, arg3);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void load(CompoundTag tag) {
|
||||
super.load(tag);
|
||||
|
||||
|
||||
risingEdgeURL = tag.getString("RisingEdgeURL");
|
||||
fallingEdgeURL = tag.getString("FallingEdgeURL");
|
||||
state = tag.getBoolean("Powered");
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void saveAdditional(CompoundTag tag) {
|
||||
super.saveAdditional(tag);
|
||||
|
|
@ -45,24 +44,24 @@ public class TileEntityRedCtrl extends TileEntityPeripheralBase {
|
|||
tag.putString("FallingEdgeURL", fallingEdgeURL);
|
||||
tag.putBoolean("Powered", state);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public InteractionResult onRightClick(Player player, InteractionHand hand) {
|
||||
if(level.isClientSide)
|
||||
if (level.isClientSide)
|
||||
return InteractionResult.SUCCESS;
|
||||
|
||||
if(!isScreenChunkLoaded()) {
|
||||
if (!isScreenChunkLoaded()) {
|
||||
Util.toast(player, "chunkUnloaded");
|
||||
return InteractionResult.SUCCESS;
|
||||
}
|
||||
|
||||
TileEntityScreen tes = getConnectedScreen();
|
||||
if(tes == null) {
|
||||
ScreenBlockEntity tes = getConnectedScreen();
|
||||
if (tes == null) {
|
||||
Util.toast(player, "notLinked");
|
||||
return InteractionResult.SUCCESS;
|
||||
}
|
||||
|
||||
TileEntityScreen.Screen scr = tes.getScreen(screenSide);
|
||||
ScreenData scr = tes.getScreen(screenSide);
|
||||
if((scr.rightsFor(player) & ScreenRights.CHANGE_URL) == 0) {
|
||||
Util.toast(player, "restrictions");
|
||||
return InteractionResult.SUCCESS;
|
||||
|
|
@ -76,10 +75,10 @@ public class TileEntityRedCtrl extends TileEntityPeripheralBase {
|
|||
public void onNeighborChange(Block neighborType, BlockPos neighborPos) {
|
||||
boolean hasPower = (level.hasNeighborSignal(getBlockPos()) || level.hasNeighborSignal(getBlockPos().above())); //Same as dispenser
|
||||
|
||||
if(hasPower != state) {
|
||||
if (hasPower != state) {
|
||||
state = hasPower;
|
||||
|
||||
if(state) //Rising edge
|
||||
if (state) //Rising edge
|
||||
changeURL(risingEdgeURL);
|
||||
else //Falling edge
|
||||
changeURL(fallingEdgeURL);
|
||||
|
|
@ -93,11 +92,11 @@ public class TileEntityRedCtrl extends TileEntityPeripheralBase {
|
|||
}
|
||||
|
||||
private void changeURL(String url) {
|
||||
if(level.isClientSide || url.isEmpty())
|
||||
if (level.isClientSide || url.isEmpty())
|
||||
return;
|
||||
|
||||
if(isScreenChunkLoaded()) {
|
||||
TileEntityScreen tes = getConnectedScreen();
|
||||
if (isScreenChunkLoaded()) {
|
||||
ScreenBlockEntity tes = getConnectedScreen();
|
||||
|
||||
if (tes != null)
|
||||
try {
|
||||
|
|
@ -12,31 +12,31 @@ import net.minecraft.world.entity.player.Player;
|
|||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.montoyo.wd.core.ScreenRights;
|
||||
import net.montoyo.wd.data.SetURLData;
|
||||
import net.montoyo.wd.init.TileInit;
|
||||
import net.montoyo.wd.utilities.Util;
|
||||
import net.montoyo.wd.registry.TileRegistry;
|
||||
import net.montoyo.wd.utilities.serialization.Util;
|
||||
|
||||
public class TileEntityRCtrl extends TileEntityPeripheralBase {
|
||||
public TileEntityRCtrl(BlockPos arg2, BlockState arg3) {
|
||||
super(TileInit.REMOTE_CONTROLLER.get(), arg2, arg3);
|
||||
public class RemoteControlBlockEntity extends AbstractPeripheralBlockEntity {
|
||||
public RemoteControlBlockEntity(BlockPos arg2, BlockState arg3) {
|
||||
super(TileRegistry.REMOTE_CONTROLLER.get(), arg2, arg3);
|
||||
}
|
||||
|
||||
@Override
|
||||
public InteractionResult onRightClick(Player player, InteractionHand hand) {
|
||||
if(level.isClientSide)
|
||||
if (level.isClientSide)
|
||||
return InteractionResult.SUCCESS;
|
||||
|
||||
if(!isScreenChunkLoaded()) {
|
||||
if (!isScreenChunkLoaded()) {
|
||||
Util.toast(player, "chunkUnloaded");
|
||||
return InteractionResult.SUCCESS;
|
||||
}
|
||||
|
||||
TileEntityScreen tes = getConnectedScreen();
|
||||
if(tes == null) {
|
||||
ScreenBlockEntity tes = getConnectedScreen();
|
||||
if (tes == null) {
|
||||
Util.toast(player, "notLinked");
|
||||
return InteractionResult.SUCCESS;
|
||||
}
|
||||
|
||||
TileEntityScreen.Screen scr = tes.getScreen(screenSide);
|
||||
ScreenData scr = tes.getScreen(screenSide);
|
||||
if((scr.rightsFor(player) & ScreenRights.CHANGE_URL) == 0) {
|
||||
Util.toast(player, "restrictions");
|
||||
return InteractionResult.SUCCESS;
|
||||
|
|
@ -45,5 +45,4 @@ public class TileEntityRCtrl extends TileEntityPeripheralBase {
|
|||
(new SetURLData(screenPos, screenSide, scr.url, getBlockPos())).sendTo((ServerPlayer) player);
|
||||
return InteractionResult.SUCCESS;
|
||||
}
|
||||
|
||||
}
|
||||
1154
src/main/java/net/montoyo/wd/entity/ScreenBlockEntity.java
Normal file
1154
src/main/java/net/montoyo/wd/entity/ScreenBlockEntity.java
Normal file
File diff suppressed because it is too large
Load Diff
211
src/main/java/net/montoyo/wd/entity/ScreenData.java
Normal file
211
src/main/java/net/montoyo/wd/entity/ScreenData.java
Normal file
|
|
@ -0,0 +1,211 @@
|
|||
package net.montoyo.wd.entity;
|
||||
|
||||
import com.cinemamod.mcef.MCEF;
|
||||
import com.cinemamod.mcef.MCEFBrowser;
|
||||
import com.cinemamod.mcef.listeners.MCEFCursorChangeListener;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.nbt.ListTag;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.montoyo.wd.WebDisplays;
|
||||
import net.montoyo.wd.client.ClientProxy;
|
||||
import net.montoyo.wd.config.CommonConfig;
|
||||
import net.montoyo.wd.core.ScreenRights;
|
||||
import net.montoyo.wd.utilities.*;
|
||||
import net.montoyo.wd.utilities.browser.InWorldQueries;
|
||||
import net.montoyo.wd.utilities.browser.WDBrowser;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.data.Rotation;
|
||||
import net.montoyo.wd.utilities.math.Vector2i;
|
||||
import net.montoyo.wd.utilities.serialization.NameUUIDPair;
|
||||
import org.cef.browser.CefBrowser;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.UUID;
|
||||
|
||||
public class ScreenData {
|
||||
public BlockSide side;
|
||||
public Vector2i size;
|
||||
public Vector2i resolution;
|
||||
public Rotation rotation = Rotation.ROT_0;
|
||||
public String url;
|
||||
protected VideoType videoType;
|
||||
public NameUUIDPair owner;
|
||||
public ArrayList<NameUUIDPair> friends;
|
||||
public int friendRights;
|
||||
public int otherRights;
|
||||
public CefBrowser browser;
|
||||
public ArrayList<ItemStack> upgrades;
|
||||
public boolean doTurnOnAnim;
|
||||
public long turnOnTime;
|
||||
public Player laserUser;
|
||||
public final Vector2i lastMousePos = new Vector2i();
|
||||
public NibbleArray redstoneStatus; //null on client
|
||||
public boolean autoVolume = true;
|
||||
|
||||
public int mouseType;
|
||||
|
||||
public static ScreenData deserialize(CompoundTag tag) {
|
||||
ScreenData ret = new ScreenData();
|
||||
ret.side = BlockSide.values()[tag.getByte("Side")];
|
||||
ret.size = new Vector2i(tag.getInt("Width"), tag.getInt("Height"));
|
||||
ret.resolution = new Vector2i(tag.getInt("ResolutionX"), tag.getInt("ResolutionY"));
|
||||
ret.rotation = Rotation.values()[tag.getByte("Rotation")];
|
||||
ret.url = tag.getString("URL");
|
||||
ret.videoType = VideoType.getTypeFromURL(ret.url);
|
||||
|
||||
if (ret.resolution.x <= 0 || ret.resolution.y <= 0) {
|
||||
float psx = ((float) ret.size.x) * 16.f - 4.f;
|
||||
float psy = ((float) ret.size.y) * 16.f - 4.f;
|
||||
psx *= 8.f; //TODO: Use ratio in config file
|
||||
psy *= 8.f;
|
||||
|
||||
ret.resolution.x = (int) psx;
|
||||
ret.resolution.y = (int) psy;
|
||||
}
|
||||
|
||||
if (tag.contains("OwnerName")) {
|
||||
String name = tag.getString("OwnerName");
|
||||
UUID uuid = tag.getUUID("OwnerUUID");
|
||||
ret.owner = new NameUUIDPair(name, uuid);
|
||||
}
|
||||
|
||||
ListTag friends = tag.getList("Friends", 10);
|
||||
ret.friends = new ArrayList<>(friends.size());
|
||||
|
||||
for (int i = 0; i < friends.size(); i++) {
|
||||
CompoundTag nf = friends.getCompound(i);
|
||||
NameUUIDPair pair = new NameUUIDPair(nf.getString("Name"), nf.getUUID("UUID"));
|
||||
ret.friends.add(pair);
|
||||
}
|
||||
|
||||
ret.friendRights = tag.getByte("FriendRights");
|
||||
ret.otherRights = tag.getByte("OtherRights");
|
||||
|
||||
ListTag upgrades = tag.getList("Upgrades", 10);
|
||||
ret.upgrades = new ArrayList<>();
|
||||
|
||||
for (int i = 0; i < upgrades.size(); i++)
|
||||
ret.upgrades.add(ItemStack.of(upgrades.getCompound(i)));
|
||||
|
||||
if (tag.contains("AutoVolume"))
|
||||
ret.autoVolume = tag.getBoolean("AutoVolume");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
public CompoundTag serialize() {
|
||||
CompoundTag tag = new CompoundTag();
|
||||
tag.putByte("Side", (byte) side.ordinal());
|
||||
tag.putInt("Width", size.x);
|
||||
tag.putInt("Height", size.y);
|
||||
tag.putInt("ResolutionX", resolution.x);
|
||||
tag.putInt("ResolutionY", resolution.y);
|
||||
tag.putByte("Rotation", (byte) rotation.ordinal());
|
||||
tag.putString("URL", url);
|
||||
|
||||
if (owner == null)
|
||||
Log.warning("Found TES with NO OWNER!!");
|
||||
else {
|
||||
tag.putString("OwnerName", owner.name);
|
||||
tag.putUUID("OwnerUUID", owner.uuid);
|
||||
}
|
||||
|
||||
ListTag list = new ListTag();
|
||||
for (NameUUIDPair f : friends) {
|
||||
CompoundTag nf = new CompoundTag();
|
||||
nf.putString("Name", f.name);
|
||||
nf.putUUID("UUID", f.uuid);
|
||||
|
||||
list.add(nf);
|
||||
}
|
||||
|
||||
tag.put("Friends", list);
|
||||
tag.putByte("FriendRights", (byte) friendRights);
|
||||
tag.putByte("OtherRights", (byte) otherRights);
|
||||
|
||||
list = new ListTag();
|
||||
for (ItemStack is : upgrades)
|
||||
list.add(is.save(new CompoundTag()));
|
||||
|
||||
tag.put("Upgrades", list);
|
||||
tag.putBoolean("AutoVolume", autoVolume);
|
||||
return tag;
|
||||
}
|
||||
|
||||
public int rightsFor(Player ply) {
|
||||
return rightsFor(ply.getGameProfile().getId());
|
||||
}
|
||||
|
||||
public int rightsFor(UUID uuid) {
|
||||
if (owner.uuid.equals(uuid))
|
||||
return ScreenRights.ALL;
|
||||
|
||||
return friends.stream().anyMatch(f -> f.uuid.equals(uuid)) ? friendRights : otherRights;
|
||||
}
|
||||
|
||||
public void setupRedstoneStatus(Level world, BlockPos start) {
|
||||
if (world.isClientSide()) {
|
||||
Log.warning("Called Screen.setupRedstoneStatus() on client.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (redstoneStatus != null) {
|
||||
Log.warning("Called Screen.setupRedstoneStatus() on server, but redstone status is non-null");
|
||||
return;
|
||||
}
|
||||
|
||||
Direction[] VALUES = Direction.values();
|
||||
redstoneStatus = new NibbleArray(size.x * size.y);
|
||||
final Direction facing = VALUES[side.reverse().ordinal()];
|
||||
final ScreenIterator it = new ScreenIterator(start, side, size);
|
||||
|
||||
while (it.hasNext()) {
|
||||
int idx = it.getIndex();
|
||||
redstoneStatus.set(idx, world.getSignal(it.next(), facing));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void clampResolution() {
|
||||
if (resolution.x > CommonConfig.Screen.maxResolutionX) {
|
||||
float newY = ((float) resolution.y) * ((float) CommonConfig.Screen.maxResolutionX) / ((float) resolution.x);
|
||||
resolution.x = CommonConfig.Screen.maxResolutionX;
|
||||
resolution.y = (int) newY;
|
||||
}
|
||||
|
||||
if (resolution.y > CommonConfig.Screen.maxResolutionY) {
|
||||
float newX = ((float) resolution.x) * ((float) CommonConfig.Screen.maxResolutionY) / ((float) resolution.y);
|
||||
resolution.x = (int) newX;
|
||||
resolution.y = CommonConfig.Screen.maxResolutionY;
|
||||
}
|
||||
}
|
||||
|
||||
public void createBrowser(ScreenBlockEntity be, boolean doAnim) {
|
||||
if (WebDisplays.PROXY instanceof ClientProxy) {
|
||||
browser = WDBrowser.createBrowser(WebDisplays.applyBlacklist(url != null ? url : "https://www.google.com"), false);
|
||||
|
||||
// set screen
|
||||
if (browser instanceof MCEFBrowser mcefBrowser) {
|
||||
if (rotation.isVertical)
|
||||
mcefBrowser.resize(resolution.y, resolution.x);
|
||||
else
|
||||
mcefBrowser.resize(resolution.x, resolution.y);
|
||||
|
||||
mcefBrowser.setCursorChangeListener((type) -> mouseType = type);
|
||||
}
|
||||
|
||||
// setup screen as in world
|
||||
if (browser instanceof WDBrowser wdBrowser) {
|
||||
InWorldQueries.attach(be, side, wdBrowser);
|
||||
}
|
||||
|
||||
doTurnOnAnim = doAnim;
|
||||
turnOnTime = System.currentTimeMillis();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -12,16 +12,15 @@ import net.minecraft.world.level.block.entity.BlockEntity;
|
|||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.montoyo.wd.WebDisplays;
|
||||
import net.montoyo.wd.data.ServerData;
|
||||
import net.montoyo.wd.init.TileInit;
|
||||
import net.montoyo.wd.utilities.NameUUIDPair;
|
||||
import net.montoyo.wd.utilities.Util;
|
||||
|
||||
public class TileEntityServer extends BlockEntity {
|
||||
import net.montoyo.wd.registry.TileRegistry;
|
||||
import net.montoyo.wd.utilities.serialization.NameUUIDPair;
|
||||
import net.montoyo.wd.utilities.serialization.Util;
|
||||
|
||||
public class ServerBlockEntity extends BlockEntity {
|
||||
private NameUUIDPair owner;
|
||||
|
||||
public TileEntityServer(BlockPos arg2, BlockState arg3) {
|
||||
super(TileInit.SERVER.get(), arg2, arg3);
|
||||
public ServerBlockEntity(BlockPos arg2, BlockState arg3) {
|
||||
super(TileRegistry.SERVER.get(), arg2, arg3);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -29,7 +28,7 @@ public class TileEntityServer extends BlockEntity {
|
|||
super.load(tag);
|
||||
owner = Util.readOwnerFromNBT(tag);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void saveAdditional(CompoundTag tag) {
|
||||
super.saveAdditional(tag);
|
||||
|
|
@ -42,13 +41,12 @@ public class TileEntityServer extends BlockEntity {
|
|||
}
|
||||
|
||||
public void onPlayerRightClick(Player ply) {
|
||||
if(level.isClientSide)
|
||||
if (level.isClientSide)
|
||||
return;
|
||||
|
||||
if( WebDisplays.INSTANCE.miniservPort == 0)
|
||||
if (WebDisplays.INSTANCE.miniservPort == 0)
|
||||
Util.toast(ply, "noMiniserv");
|
||||
else if(owner != null && ply instanceof ServerPlayer)
|
||||
else if (owner != null && ply instanceof ServerPlayer)
|
||||
(new ServerData(getBlockPos(), owner)).sendTo((ServerPlayer) ply);
|
||||
}
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,32 +0,0 @@
|
|||
package net.montoyo.wd.init;
|
||||
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.level.block.state.BlockBehaviour;
|
||||
import net.minecraftforge.eventbus.api.IEventBus;
|
||||
import net.minecraftforge.registries.DeferredRegister;
|
||||
import net.minecraftforge.registries.ForgeRegistries;
|
||||
import net.minecraftforge.registries.RegistryObject;
|
||||
import net.montoyo.wd.block.BlockKeyboardLeft;
|
||||
import net.montoyo.wd.block.BlockKeyboardRight;
|
||||
import net.montoyo.wd.block.BlockPeripheral;
|
||||
import net.montoyo.wd.block.BlockScreen;
|
||||
import net.montoyo.wd.core.DefaultPeripheral;
|
||||
|
||||
public class BlockInit {
|
||||
|
||||
public static void init(IEventBus bus) {
|
||||
BLOCKS.register(bus);
|
||||
}
|
||||
|
||||
public static DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, "webdisplays");
|
||||
|
||||
public static final RegistryObject<BlockScreen> blockScreen = BLOCKS.register("screen", () -> new BlockScreen(BlockBehaviour.Properties.copy(Blocks.STONE)));
|
||||
|
||||
public static final RegistryObject<BlockKeyboardLeft> blockKeyBoard = BlockInit.BLOCKS.register("kb_left", BlockKeyboardLeft::new);
|
||||
public static final RegistryObject<BlockKeyboardRight> blockKbRight = BLOCKS.register("kb_right", BlockKeyboardRight::new);
|
||||
|
||||
public static final RegistryObject<BlockPeripheral> blockRedControl = BlockInit.BLOCKS.register("redctrl", () -> new BlockPeripheral(DefaultPeripheral.REDSTONE_CONTROLLER));
|
||||
public static final RegistryObject<BlockPeripheral> blockRControl = BlockInit.BLOCKS.register("rctrl", () -> new BlockPeripheral(DefaultPeripheral.REMOTE_CONTROLLER));
|
||||
public static final RegistryObject<BlockPeripheral> blockServer = BlockInit.BLOCKS.register("server", () -> new BlockPeripheral(DefaultPeripheral.SERVER));
|
||||
}
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
package net.montoyo.wd.init;
|
||||
|
||||
import net.minecraft.world.level.ClipContext;
|
||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||
import net.minecraftforge.eventbus.api.IEventBus;
|
||||
import net.minecraftforge.registries.DeferredRegister;
|
||||
import net.minecraftforge.registries.ForgeRegistries;
|
||||
import net.minecraftforge.registries.RegistryObject;
|
||||
import net.montoyo.wd.core.DefaultPeripheral;
|
||||
import net.montoyo.wd.entity.*;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
public class TileInit {
|
||||
|
||||
public static final DeferredRegister<BlockEntityType<?>> TILE_TYPES = DeferredRegister
|
||||
.create(ForgeRegistries.BLOCK_ENTITY_TYPES, "webdisplays");
|
||||
|
||||
//Register tile entities
|
||||
public static final RegistryObject<BlockEntityType<TileEntityScreen>> SCREEN_BLOCK_ENTITY = TILE_TYPES
|
||||
.register("screen", () -> BlockEntityType.Builder
|
||||
.of(TileEntityScreen::new, BlockInit.blockScreen.get()).build(null));
|
||||
|
||||
public static final RegistryObject<BlockEntityType<?>> KEYBOARD = TILE_TYPES.register("kb_left", () -> BlockEntityType.Builder
|
||||
.of(TileEntityKeyboard::new, BlockInit.blockKeyBoard.get()).build(null));
|
||||
|
||||
public static final RegistryObject<BlockEntityType<?>> REMOTE_CONTROLLER = TILE_TYPES.register("rctrl",
|
||||
() -> BlockEntityType.Builder.of(TileEntityRCtrl::new, BlockInit.blockRControl.get()).build(null)); //WITHOUT FACING (>= 3)
|
||||
|
||||
public static final RegistryObject<BlockEntityType<?>> REDSTONE_CONTROLLER = TILE_TYPES.register("redctrl",
|
||||
() -> BlockEntityType.Builder.of(TileEntityRedCtrl::new, BlockInit.blockRedControl.get()).build(null));
|
||||
|
||||
public static final RegistryObject<BlockEntityType<?>> SERVER = TILE_TYPES.register("server" ,
|
||||
() -> BlockEntityType.Builder.of(TileEntityServer::new, BlockInit.blockServer.get()).build(null));
|
||||
|
||||
public static void init(IEventBus bus) {
|
||||
TILE_TYPES.register(bus);
|
||||
}
|
||||
}
|
||||
|
|
@ -10,7 +10,6 @@ import net.montoyo.wd.core.CraftComponent;
|
|||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class ItemCraftComponent extends ItemMulti implements WDItem {
|
||||
|
||||
public ItemCraftComponent(Properties properties) {
|
||||
super(CraftComponent.class, properties
|
||||
// .tab(WebDisplays.CREATIVE_TAB)
|
||||
|
|
|
|||
|
|
@ -11,20 +11,20 @@ import net.minecraft.world.item.ItemStack;
|
|||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.minecraft.world.phys.BlockHitResult;
|
||||
import net.minecraft.world.phys.HitResult;
|
||||
import net.montoyo.wd.WebDisplays;
|
||||
import net.montoyo.wd.block.BlockScreen;
|
||||
import net.montoyo.wd.block.ScreenBlock;
|
||||
import net.montoyo.wd.client.ClientProxy;
|
||||
import net.montoyo.wd.config.ClientConfig;
|
||||
import net.montoyo.wd.controls.builtin.ClickControl;
|
||||
import net.montoyo.wd.core.DefaultUpgrade;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.init.BlockInit;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.entity.ScreenData;
|
||||
import net.montoyo.wd.net.WDNetworkRegistry;
|
||||
import net.montoyo.wd.net.server_bound.C2SMessageScreenCtrl;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.registry.BlockRegistry;
|
||||
import net.montoyo.wd.utilities.Multiblock;
|
||||
import net.montoyo.wd.utilities.Vector2i;
|
||||
import net.montoyo.wd.utilities.Vector3i;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.math.Vector2i;
|
||||
import net.montoyo.wd.utilities.math.Vector3i;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
|
@ -39,7 +39,7 @@ public class ItemLaserPointer extends Item implements WDItem {
|
|||
}
|
||||
|
||||
//Laser pointer
|
||||
private static TileEntityScreen pointedScreen;
|
||||
private static ScreenBlockEntity pointedScreen;
|
||||
private static BlockSide pointedScreenSide;
|
||||
private static long lastPointPacket;
|
||||
|
||||
|
|
@ -53,16 +53,16 @@ public class ItemLaserPointer extends Item implements WDItem {
|
|||
|
||||
BlockPos bpos = result.getBlockPos();
|
||||
|
||||
if (result.getType() == HitResult.Type.BLOCK && mc.level.getBlockState(bpos).getBlock() == BlockInit.blockScreen.get()) {
|
||||
if (result.getType() == HitResult.Type.BLOCK && mc.level.getBlockState(bpos).getBlock() == BlockRegistry.SCREEN_BLOCk.get()) {
|
||||
Vector3i pos = new Vector3i(result.getBlockPos());
|
||||
BlockSide side = BlockSide.values()[result.getDirection().ordinal()];
|
||||
|
||||
Multiblock.findOrigin(mc.level, pos, side, null);
|
||||
TileEntityScreen te = (TileEntityScreen) mc.level.getBlockEntity(pos.toBlock());
|
||||
ScreenBlockEntity te = (ScreenBlockEntity) mc.level.getBlockEntity(pos.toBlock());
|
||||
|
||||
if (te != null && te.hasUpgrade(side, DefaultUpgrade.LASERMOUSE)) { //hasUpgrade returns false is there's no screen on side 'side'
|
||||
//Since rights aren't synchronized, let the server check them for us...
|
||||
TileEntityScreen.Screen scr = te.getScreen(side);
|
||||
ScreenData scr = te.getScreen(side);
|
||||
|
||||
if (scr.browser != null) {
|
||||
float hitX = ((float) result.getLocation().x) - (float) pos.x;
|
||||
|
|
@ -70,7 +70,7 @@ public class ItemLaserPointer extends Item implements WDItem {
|
|||
float hitZ = ((float) result.getLocation().z) - (float) pos.z;
|
||||
Vector2i tmp = new Vector2i();
|
||||
|
||||
if (BlockScreen.hit2pixels(side, bpos, new Vector3i(result.getBlockPos()), scr, hitX, hitY, hitZ, tmp)) {
|
||||
if (ScreenBlock.hit2pixels(side, bpos, new Vector3i(result.getBlockPos()), scr, hitX, hitY, hitZ, tmp)) {
|
||||
laserClick(te, side, scr, tmp);
|
||||
}
|
||||
}
|
||||
|
|
@ -82,7 +82,7 @@ public class ItemLaserPointer extends Item implements WDItem {
|
|||
deselectScreen();
|
||||
}
|
||||
|
||||
private static void laserClick(TileEntityScreen tes, BlockSide side, TileEntityScreen.Screen scr, Vector2i hit) {
|
||||
private static void laserClick(ScreenBlockEntity tes, BlockSide side, ScreenData scr, Vector2i hit) {
|
||||
tes.handleMouseEvent(side, ClickControl.ControlType.MOVE, hit, -1);
|
||||
if (pointedScreen == tes && pointedScreenSide == side) {
|
||||
long t = System.currentTimeMillis();
|
||||
|
|
@ -106,7 +106,7 @@ public class ItemLaserPointer extends Item implements WDItem {
|
|||
}
|
||||
|
||||
public static void press(boolean press, int button) {
|
||||
if (button <= 1 && ClientConfig.switchButtons)
|
||||
if (button <= 1 && ClientConfig.Input.switchButtons)
|
||||
button = 1 - button;
|
||||
|
||||
if (button == 0) left = press;
|
||||
|
|
@ -120,32 +120,23 @@ public class ItemLaserPointer extends Item implements WDItem {
|
|||
BlockSide side = BlockSide.values()[result.getDirection().ordinal()];
|
||||
Multiblock.findOrigin(mc.level, pos, side, null);
|
||||
|
||||
float hitX = ((float) result.getLocation().x) - (float) pos.x;
|
||||
float hitY = ((float) result.getLocation().y) - (float) pos.y;
|
||||
float hitZ = ((float) result.getLocation().z) - (float) pos.z;
|
||||
Vector2i tmp = new Vector2i();
|
||||
|
||||
BlockEntity be = mc.level.getBlockEntity(pos.toBlock());
|
||||
if (!(be instanceof TileEntityScreen)) return;
|
||||
if (!(be instanceof ScreenBlockEntity)) return;
|
||||
|
||||
//noinspection PatternVariableCanBeUsed
|
||||
TileEntityScreen te = (TileEntityScreen) be;
|
||||
ScreenBlockEntity te = (ScreenBlockEntity) be;
|
||||
|
||||
if (te.hasUpgrade(side, DefaultUpgrade.LASERMOUSE)) { //hasUpgrade returns false is there's no screen on side 'side'
|
||||
//Since rights aren't synchronized, let the server check them for us...
|
||||
TileEntityScreen.Screen scr = te.getScreen(side);
|
||||
|
||||
if (scr.browser != null) {
|
||||
if (BlockScreen.hit2pixels(side, result.getBlockPos(), new Vector3i(result.getBlockPos()), scr, hitX, hitY, hitZ, tmp)) {
|
||||
te.handleMouseEvent(side, ClickControl.ControlType.MOVE, tmp, -1);
|
||||
te.handleMouseEvent(side, press ? ClickControl.ControlType.DOWN : ClickControl.ControlType.UP, tmp, button);
|
||||
|
||||
if (press)
|
||||
WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.laserDown(te, side, tmp, button));
|
||||
else
|
||||
WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.laserUp(te, side, button));
|
||||
}
|
||||
}
|
||||
int finalButton = button;
|
||||
te.interact(result, (hit) -> {
|
||||
te.handleMouseEvent(side, ClickControl.ControlType.MOVE, hit, -1);
|
||||
te.handleMouseEvent(side, press ? ClickControl.ControlType.DOWN : ClickControl.ControlType.UP, hit, finalButton);
|
||||
|
||||
if (press)
|
||||
WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.laserDown(te, side, hit, finalButton));
|
||||
else
|
||||
WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.laserUp(te, side, finalButton));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -14,46 +14,46 @@ import net.minecraft.world.item.context.UseOnContext;
|
|||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.montoyo.wd.WebDisplays;
|
||||
import net.montoyo.wd.block.BlockScreen;
|
||||
import net.montoyo.wd.block.ScreenBlock;
|
||||
import net.montoyo.wd.core.IPeripheral;
|
||||
import net.montoyo.wd.core.ScreenRights;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.entity.ScreenData;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.Multiblock;
|
||||
import net.montoyo.wd.utilities.Util;
|
||||
import net.montoyo.wd.utilities.Vector3i;
|
||||
import net.montoyo.wd.utilities.serialization.Util;
|
||||
import net.montoyo.wd.utilities.math.Vector3i;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public class ItemLinker extends Item implements WDItem {
|
||||
|
||||
public ItemLinker(Properties properties) {
|
||||
super(properties
|
||||
.stacksTo(1)
|
||||
.stacksTo(1)
|
||||
// .tab(WebDisplays.CREATIVE_TAB)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public InteractionResult useOn(UseOnContext context) {
|
||||
if(context.getLevel().isClientSide())
|
||||
if (context.getLevel().isClientSide())
|
||||
return InteractionResult.SUCCESS;
|
||||
|
||||
ItemStack stack = context.getPlayer().getItemInHand(context.getHand());
|
||||
CompoundTag tag = stack.getTag();
|
||||
|
||||
if(tag != null) {
|
||||
if(tag.contains("ScreenX") && tag.contains("ScreenY") && tag.contains("ScreenZ") && tag.contains("ScreenSide")) {
|
||||
if (tag != null) {
|
||||
if (tag.contains("ScreenX") && tag.contains("ScreenY") && tag.contains("ScreenZ") && tag.contains("ScreenSide")) {
|
||||
BlockState state = context.getLevel().getBlockState(context.getClickedPos());
|
||||
IPeripheral target;
|
||||
|
||||
if(state.getBlock() instanceof IPeripheral)
|
||||
if (state.getBlock() instanceof IPeripheral)
|
||||
target = (IPeripheral) state.getBlock();
|
||||
else {
|
||||
BlockEntity te = context.getLevel().getBlockEntity(context.getClickedPos());
|
||||
if(te == null || !(te instanceof IPeripheral)) {
|
||||
if(context.getPlayer().isShiftKeyDown()) {
|
||||
if (te == null || !(te instanceof IPeripheral)) {
|
||||
if (context.getPlayer().isShiftKeyDown()) {
|
||||
Util.toast(context.getPlayer(), ChatFormatting.GOLD, "linkAbort");
|
||||
stack.setTag(null);
|
||||
} else
|
||||
|
|
@ -68,10 +68,10 @@ public class ItemLinker extends Item implements WDItem {
|
|||
Vector3i tePos = new Vector3i(tag.getInt("ScreenX"), tag.getInt("ScreenY"), tag.getInt("ScreenZ"));
|
||||
BlockSide scrSide = BlockSide.values()[tag.getByte("ScreenSide")];
|
||||
|
||||
if(target.connect(context.getLevel(), context.getClickedPos(), state, tePos, scrSide)) {
|
||||
if (target.connect(context.getLevel(), context.getClickedPos(), state, tePos, scrSide)) {
|
||||
Util.toast(context.getPlayer(), ChatFormatting.AQUA, "linked");
|
||||
|
||||
if(context.getPlayer() instanceof ServerPlayer)
|
||||
if (context.getPlayer() instanceof ServerPlayer)
|
||||
WebDisplays.INSTANCE.criterionLinkPeripheral.trigger(((ServerPlayer) context.getPlayer()).getAdvancements());
|
||||
} else
|
||||
Util.toast(context.getPlayer(), "linkError");
|
||||
|
|
@ -81,7 +81,7 @@ public class ItemLinker extends Item implements WDItem {
|
|||
}
|
||||
}
|
||||
|
||||
if(!(context.getLevel().getBlockState(context.getClickedPos()).getBlock() instanceof BlockScreen)) {
|
||||
if (!(context.getLevel().getBlockState(context.getClickedPos()).getBlock() instanceof ScreenBlock)) {
|
||||
Util.toast(context.getPlayer(), "notAScreen");
|
||||
return InteractionResult.SUCCESS;
|
||||
}
|
||||
|
|
@ -91,15 +91,15 @@ public class ItemLinker extends Item implements WDItem {
|
|||
Multiblock.findOrigin(context.getLevel(), pos, side, null);
|
||||
|
||||
BlockEntity te = context.getLevel().getBlockEntity(pos.toBlock());
|
||||
if(te == null || !(te instanceof TileEntityScreen)) {
|
||||
if (te == null || !(te instanceof ScreenBlockEntity)) {
|
||||
Util.toast(context.getPlayer(), "turnOn");
|
||||
return InteractionResult.SUCCESS;
|
||||
}
|
||||
|
||||
TileEntityScreen.Screen scr = ((TileEntityScreen) te).getScreen(side);
|
||||
ScreenData scr = ((ScreenBlockEntity) te).getScreen(side);
|
||||
if(scr == null)
|
||||
Util.toast(context.getPlayer(), "turnOn");
|
||||
else if((scr.rightsFor(context.getPlayer()) & ScreenRights.MANAGE_UPGRADES) == 0)
|
||||
else if ((scr.rightsFor(context.getPlayer()) & ScreenRights.MANAGE_UPGRADES) == 0)
|
||||
Util.toast(context.getPlayer(), "restrictions");
|
||||
else {
|
||||
tag = new CompoundTag();
|
||||
|
|
@ -120,5 +120,4 @@ public class ItemLinker extends Item implements WDItem {
|
|||
public String getWikiName(@Nonnull ItemStack is) {
|
||||
return is.getItem().getName(is).getString();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,90 +28,88 @@ import javax.annotation.Nullable;
|
|||
import java.util.UUID;
|
||||
|
||||
public class ItemMinePad2 extends Item implements WDItem {
|
||||
|
||||
public ItemMinePad2(Properties properties) {
|
||||
super(properties
|
||||
.stacksTo(1)
|
||||
.defaultDurability(0)
|
||||
public ItemMinePad2(Properties properties) {
|
||||
super(properties
|
||||
.stacksTo(1)
|
||||
.defaultDurability(0)
|
||||
// .tab(WebDisplays.CREATIVE_TAB)
|
||||
);
|
||||
}
|
||||
|
||||
private static String getURL(ItemStack is) {
|
||||
if (is.getTag() == null || !is.getTag().contains("PadURL"))
|
||||
return CommonConfig.Browser.homepage;
|
||||
else
|
||||
return is.getTag().getString("PadURL");
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nonnull
|
||||
public InteractionResultHolder<ItemStack> use(Level world, Player ply, @Nonnull InteractionHand hand) {
|
||||
ItemStack is = ply.getItemInHand(hand);
|
||||
boolean ok;
|
||||
|
||||
if (ply.isShiftKeyDown()) {
|
||||
if (world.isClientSide)
|
||||
WebDisplays.PROXY.displaySetPadURLGui(is, getURL(is));
|
||||
|
||||
ok = true;
|
||||
} else if (is.getTag() != null && is.getTag().contains("PadID")) {
|
||||
if (world.isClientSide)
|
||||
WebDisplays.PROXY.openMinePadGui(is.getTag().getUUID("PadID"));
|
||||
|
||||
ok = true;
|
||||
} else {
|
||||
UUID uuid = UUID.randomUUID();
|
||||
String url = getURL(is);
|
||||
WDNetworkRegistry.INSTANCE.sendToServer(new C2SMessageMinepadUrl(uuid, url));
|
||||
is.getOrCreateTag().putUUID("PadID", uuid);
|
||||
|
||||
ok = true;
|
||||
}
|
||||
|
||||
return new InteractionResultHolder<>(ok ? InteractionResult.SUCCESS : InteractionResult.PASS, is);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onEntityItemUpdate(ItemStack stack, ItemEntity ent) {
|
||||
if (ent.onGround() && !ent.level().isClientSide) {
|
||||
CompoundTag tag = ent.getItem().getTag();
|
||||
|
||||
if (tag != null && tag.contains("ThrowHeight")) {
|
||||
//Delete it, it touched the ground
|
||||
double height = tag.getDouble("ThrowHeight");
|
||||
UUID thrower = null;
|
||||
|
||||
if (tag.contains("ThrowerMSB") && tag.contains("ThrowerLSB"))
|
||||
thrower = new UUID(tag.getLong("ThrowerMSB"), tag.getLong("ThrowerLSB"));
|
||||
|
||||
if (tag.contains("PadID") || tag.contains("PadURL")) {
|
||||
tag.remove("ThrowerMSB");
|
||||
tag.remove("ThrowerLSB");
|
||||
tag.remove("ThrowHeight");
|
||||
} else //We can delete the whole tag
|
||||
ent.getItem().setTag(null);
|
||||
|
||||
if (thrower != null && height - ent.getBlockY() >= 20.0) {
|
||||
ent.level().playSound(null, ent.getBlockX(), ent.getBlockY(), ent.getBlockZ(), SoundEvents.GLASS_BREAK, SoundSource.BLOCKS, 4.0f, 1.0f);
|
||||
ent.level().addFreshEntity(new ItemEntity(ent.level(), ent.getBlockX(), ent.getBlockY(), ent.getBlockZ(), CraftComponent.EXTCARD.makeItemStack()));
|
||||
ent.setRemoved(Entity.RemovalReason.CHANGED_DIMENSION);
|
||||
|
||||
Player ply = ent.level().getPlayerByUUID(thrower);
|
||||
if (ply != null && ply instanceof ServerPlayer)
|
||||
WebDisplays.INSTANCE.criterionPadBreak.trigger(((ServerPlayer) ply).getAdvancements());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public String getWikiName(@Nonnull ItemStack is) {
|
||||
return is.getItem().getName(is).getString();
|
||||
}
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
private static String getURL(ItemStack is) {
|
||||
if (is.getTag() == null || !is.getTag().contains("PadURL"))
|
||||
return CommonConfig.Browser.homepage;
|
||||
else
|
||||
return is.getTag().getString("PadURL");
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nonnull
|
||||
public InteractionResultHolder<ItemStack> use(Level world, Player ply, @Nonnull InteractionHand hand) {
|
||||
ItemStack is = ply.getItemInHand(hand);
|
||||
boolean ok;
|
||||
|
||||
if (ply.isShiftKeyDown()) {
|
||||
if (world.isClientSide)
|
||||
WebDisplays.PROXY.displaySetPadURLGui(is, getURL(is));
|
||||
|
||||
ok = true;
|
||||
} else if (is.getTag() != null && is.getTag().contains("PadID")) {
|
||||
if (world.isClientSide)
|
||||
WebDisplays.PROXY.openMinePadGui(is.getTag().getUUID("PadID"));
|
||||
|
||||
ok = true;
|
||||
} else {
|
||||
UUID uuid = UUID.randomUUID();
|
||||
String url = getURL(is);
|
||||
WDNetworkRegistry.INSTANCE.sendToServer(new C2SMessageMinepadUrl(uuid, url));
|
||||
is.getOrCreateTag().putUUID("PadID", uuid);
|
||||
|
||||
ok = true;
|
||||
}
|
||||
|
||||
return new InteractionResultHolder<>(ok ? InteractionResult.SUCCESS : InteractionResult.PASS, is);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onEntityItemUpdate(ItemStack stack, ItemEntity ent) {
|
||||
if (ent.onGround() && !ent.level().isClientSide) {
|
||||
CompoundTag tag = ent.getItem().getTag();
|
||||
|
||||
if (tag != null && tag.contains("ThrowHeight")) {
|
||||
//Delete it, it touched the ground
|
||||
double height = tag.getDouble("ThrowHeight");
|
||||
UUID thrower = null;
|
||||
|
||||
if (tag.contains("ThrowerMSB") && tag.contains("ThrowerLSB"))
|
||||
thrower = new UUID(tag.getLong("ThrowerMSB"), tag.getLong("ThrowerLSB"));
|
||||
|
||||
if (tag.contains("PadID") || tag.contains("PadURL")) {
|
||||
tag.remove("ThrowerMSB");
|
||||
tag.remove("ThrowerLSB");
|
||||
tag.remove("ThrowHeight");
|
||||
} else //We can delete the whole tag
|
||||
ent.getItem().setTag(null);
|
||||
|
||||
if (thrower != null && height - ent.getBlockY() >= 20.0) {
|
||||
ent.level().playSound(null, ent.getBlockX(), ent.getBlockY(), ent.getBlockZ(), SoundEvents.GLASS_BREAK, SoundSource.BLOCKS, 4.0f, 1.0f);
|
||||
ent.level().addFreshEntity(new ItemEntity(ent.level(), ent.getBlockX(), ent.getBlockY(), ent.getBlockZ(), CraftComponent.EXTCARD.makeItemStack()));
|
||||
ent.setRemoved(Entity.RemovalReason.CHANGED_DIMENSION);
|
||||
|
||||
Player ply = ent.level().getPlayerByUUID(thrower);
|
||||
if (ply != null && ply instanceof ServerPlayer)
|
||||
WebDisplays.INSTANCE.criterionPadBreak.trigger(((ServerPlayer) ply).getAdvancements());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public String getWikiName(@Nonnull ItemStack is) {
|
||||
return is.getItem().getName(is).getString();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ import net.minecraft.world.item.Item;
|
|||
import java.util.BitSet;
|
||||
|
||||
public class ItemMulti extends Item {
|
||||
|
||||
protected final Enum[] values;
|
||||
protected final BitSet creativeTabItems;
|
||||
|
||||
|
|
|
|||
|
|
@ -12,55 +12,57 @@ import net.minecraft.world.item.Item;
|
|||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.context.UseOnContext;
|
||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.montoyo.wd.WebDisplays;
|
||||
import net.montoyo.wd.block.BlockScreen;
|
||||
import net.montoyo.wd.block.ScreenBlock;
|
||||
import net.montoyo.wd.config.CommonConfig;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.entity.ScreenData;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.utilities.*;
|
||||
import net.montoyo.wd.utilities.math.Vector3i;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.serialization.Util;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public class ItemOwnershipThief extends Item implements WDItem {
|
||||
|
||||
public ItemOwnershipThief(Properties properties) {
|
||||
super(properties
|
||||
.stacksTo(1)
|
||||
.stacksTo(1)
|
||||
// .tab(WebDisplays.CREATIVE_TAB)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull InteractionResult useOn(UseOnContext context) {
|
||||
if(context.getPlayer().isShiftKeyDown())
|
||||
if (context.getPlayer().isShiftKeyDown())
|
||||
return InteractionResult.PASS;
|
||||
|
||||
if(context.getLevel().isClientSide)
|
||||
if (context.getLevel().isClientSide)
|
||||
return InteractionResult.SUCCESS;
|
||||
|
||||
if(CommonConfig.disableOwnershipThief) {
|
||||
if (CommonConfig.disableOwnershipThief) {
|
||||
Util.toast(context.getPlayer(), "otDisabled");
|
||||
return InteractionResult.SUCCESS;
|
||||
}
|
||||
|
||||
ItemStack stack = context.getPlayer().getItemInHand(context.getHand());
|
||||
if(stack.hasTag()) {
|
||||
if (stack.hasTag()) {
|
||||
CompoundTag tag = stack.getTag();
|
||||
|
||||
if(tag.contains("PosX") && tag.contains("PosY") && tag.contains("PosZ") && tag.contains("Side")) {
|
||||
if (tag.contains("PosX") && tag.contains("PosY") && tag.contains("PosZ") && tag.contains("Side")) {
|
||||
BlockPos bp = new BlockPos(tag.getInt("PosX"), tag.getInt("PosY"), tag.getInt("PosZ"));
|
||||
BlockSide side = BlockSide.values()[tag.getByte("Side")];
|
||||
|
||||
if(!(context.getLevel().getBlockState(bp).getBlock() instanceof BlockScreen))
|
||||
if (!(context.getLevel().getBlockState(bp).getBlock() instanceof ScreenBlock))
|
||||
return InteractionResult.SUCCESS;
|
||||
|
||||
BlockEntity te = context.getLevel().getBlockEntity(bp);
|
||||
if(te == null || !(te instanceof TileEntityScreen))
|
||||
if (te == null || !(te instanceof ScreenBlockEntity))
|
||||
return InteractionResult.SUCCESS;
|
||||
|
||||
TileEntityScreen tes = (TileEntityScreen) te;
|
||||
TileEntityScreen.Screen scr = tes.getScreen(side);
|
||||
ScreenBlockEntity tes = (ScreenBlockEntity) te;
|
||||
ScreenData scr = tes.getScreen(side);
|
||||
if(scr == null)
|
||||
return InteractionResult.SUCCESS;
|
||||
|
||||
|
|
@ -72,20 +74,20 @@ public class ItemOwnershipThief extends Item implements WDItem {
|
|||
}
|
||||
}
|
||||
|
||||
if(!(context.getLevel().getBlockState(context.getClickedPos()).getBlock() instanceof BlockScreen))
|
||||
if (!(context.getLevel().getBlockState(context.getClickedPos()).getBlock() instanceof ScreenBlock))
|
||||
return InteractionResult.SUCCESS;
|
||||
|
||||
Vector3i pos = new Vector3i(context.getClickedPos());
|
||||
BlockSide side = BlockSide.values()[context.getHorizontalDirection().ordinal()];
|
||||
BlockSide side = BlockSide.values()[context.getClickedFace().ordinal()];
|
||||
Multiblock.findOrigin(context.getLevel(), pos, side, null);
|
||||
|
||||
BlockEntity te = context.getLevel().getBlockEntity(pos.toBlock());
|
||||
if(te == null || !(te instanceof TileEntityScreen)) {
|
||||
if (te == null || !(te instanceof ScreenBlockEntity)) {
|
||||
Util.toast(context.getPlayer(), "turnOn");
|
||||
return InteractionResult.SUCCESS;
|
||||
}
|
||||
|
||||
if(((TileEntityScreen) te).getScreen(side) == null)
|
||||
if (((ScreenBlockEntity) te).getScreen(side) == null)
|
||||
Util.toast(context.getPlayer(), "turnOn");
|
||||
else {
|
||||
CompoundTag tag = new CompoundTag();
|
||||
|
|
@ -107,5 +109,4 @@ public class ItemOwnershipThief extends Item implements WDItem {
|
|||
public String getWikiName(@Nonnull ItemStack is) {
|
||||
return "Ownership_Thief";
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,45 +10,44 @@ import net.minecraft.world.item.Item;
|
|||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.context.UseOnContext;
|
||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.montoyo.wd.WebDisplays;
|
||||
import net.montoyo.wd.block.BlockScreen;
|
||||
import net.montoyo.wd.block.ScreenBlock;
|
||||
import net.montoyo.wd.data.ScreenConfigData;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.entity.ScreenData;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import net.montoyo.wd.utilities.Multiblock;
|
||||
import net.montoyo.wd.utilities.Util;
|
||||
import net.montoyo.wd.utilities.Vector3i;
|
||||
import net.montoyo.wd.utilities.serialization.Util;
|
||||
import net.montoyo.wd.utilities.math.Vector3i;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class ItemScreenConfigurator extends Item implements WDItem {
|
||||
|
||||
public ItemScreenConfigurator(Properties properties) {
|
||||
super(properties
|
||||
.stacksTo(1)
|
||||
.stacksTo(1)
|
||||
// .tab(WebDisplays.CREATIVE_TAB)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public InteractionResult useOn(UseOnContext context) {
|
||||
if(context.getPlayer().isShiftKeyDown() || !(context.getLevel().getBlockState(context.getClickedPos()).getBlock() instanceof BlockScreen))
|
||||
if (context.getPlayer().isShiftKeyDown() || !(context.getLevel().getBlockState(context.getClickedPos()).getBlock() instanceof ScreenBlock))
|
||||
return InteractionResult.PASS;
|
||||
|
||||
if(context.getLevel().isClientSide)
|
||||
if (context.getLevel().isClientSide)
|
||||
return InteractionResult.SUCCESS;
|
||||
|
||||
Vector3i origin = new Vector3i(context.getClickedPos());
|
||||
BlockSide side = BlockSide.values()[context.getHorizontalDirection().getOpposite().ordinal()];
|
||||
BlockSide side = BlockSide.values()[context.getClickedFace().ordinal()];
|
||||
|
||||
Multiblock.findOrigin(context.getLevel(), origin, side, null);
|
||||
BlockEntity te = context.getLevel().getBlockEntity(origin.toBlock());
|
||||
|
||||
if(te == null || !(te instanceof TileEntityScreen)) {
|
||||
if (te == null || !(te instanceof ScreenBlockEntity)) {
|
||||
Util.toast(context.getPlayer(), "turnOn");
|
||||
return InteractionResult.SUCCESS;
|
||||
}
|
||||
|
||||
TileEntityScreen.Screen scr = ((TileEntityScreen) te).getScreen(side);
|
||||
ScreenData scr = ((ScreenBlockEntity) te).getScreen(side);
|
||||
if(scr == null)
|
||||
Util.toast(context.getPlayer(), "turnOn");
|
||||
else
|
||||
|
|
|
|||
|
|
@ -7,11 +7,10 @@ package net.montoyo.wd.item;
|
|||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.montoyo.wd.WebDisplays;
|
||||
import net.montoyo.wd.core.DefaultUpgrade;
|
||||
import net.montoyo.wd.core.IUpgrade;
|
||||
import net.montoyo.wd.entity.TileEntityScreen;
|
||||
import net.montoyo.wd.utilities.BlockSide;
|
||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||
import net.montoyo.wd.utilities.data.BlockSide;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
|
@ -19,19 +18,19 @@ import javax.annotation.Nullable;
|
|||
|
||||
public class ItemUpgrade extends ItemMulti implements IUpgrade, WDItem {
|
||||
public final DefaultUpgrade type;
|
||||
|
||||
|
||||
public ItemUpgrade(DefaultUpgrade type) {
|
||||
super(DefaultUpgrade.class, new Properties()/*.tab(WebDisplays.CREATIVE_TAB)*/);
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInstall(@Nonnull TileEntityScreen tes, @Nonnull BlockSide screenSide, @Nullable Player player, @Nonnull ItemStack is) {
|
||||
public void onInstall(@Nonnull ScreenBlockEntity tes, @Nonnull BlockSide screenSide, @Nullable Player player, @Nonnull ItemStack is) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onRemove(@Nonnull TileEntityScreen tes, @Nonnull BlockSide screenSide, @Nullable Player player, @Nonnull ItemStack is) {
|
||||
if(DefaultUpgrade.LASERMOUSE.matchesLaserMouse(is))
|
||||
public boolean onRemove(@Nonnull ScreenBlockEntity tes, @Nonnull BlockSide screenSide, @Nullable Player player, @Nonnull ItemStack is) {
|
||||
if (DefaultUpgrade.LASERMOUSE.matchesLaserMouse(is))
|
||||
tes.clearLaserUser(screenSide);
|
||||
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -14,10 +14,9 @@ import javax.annotation.Nullable;
|
|||
import java.util.List;
|
||||
|
||||
public interface WDItem {
|
||||
|
||||
static void addInformation(@Nullable List<String> tt) {
|
||||
if(tt != null && WebDisplays.PROXY.isShiftDown())
|
||||
tt.add("" + ChatFormatting.GRAY + I18n.get("item.webdisplays.wiki"));
|
||||
if (tt != null && WebDisplays.PROXY.isShiftDown())
|
||||
tt.add(ChatFormatting.GRAY + I18n.get("item.webdisplays.wiki"));
|
||||
}
|
||||
|
||||
String getWikiName(@Nonnull ItemStack is);
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ import net.minecraft.world.entity.player.Player;
|
|||
import net.montoyo.wd.miniserv.*;
|
||||
import net.montoyo.wd.net.server_bound.C2SMessageMiniservConnect;
|
||||
import net.montoyo.wd.utilities.Log;
|
||||
import net.montoyo.wd.utilities.Util;
|
||||
import net.montoyo.wd.utilities.serialization.Util;
|
||||
|
||||
import javax.crypto.*;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ public class ClientTaskCheckFile extends ClientTask<ClientTaskCheckFile> {
|
|||
|
||||
public String getURL() {
|
||||
try {
|
||||
return ((new StringBuilder("wd://"))).append(uuid.toString()).append('/').append(URLEncoder.encode(fname, "UTF-8")).toString();
|
||||
return ((new StringBuilder("webdisplays://"))).append(uuid.toString()).append('/').append(URLEncoder.encode(fname, "UTF-8")).toString();
|
||||
} catch(UnsupportedEncodingException ex) {
|
||||
ex.printStackTrace();
|
||||
return "hi";
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import net.montoyo.wd.miniserv.Constants;
|
|||
import net.montoyo.wd.miniserv.OutgoingPacket;
|
||||
import net.montoyo.wd.miniserv.PacketID;
|
||||
import net.montoyo.wd.utilities.Log;
|
||||
import net.montoyo.wd.utilities.Util;
|
||||
import net.montoyo.wd.utilities.serialization.Util;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ package net.montoyo.wd.miniserv.server;
|
|||
|
||||
import net.montoyo.wd.WebDisplays;
|
||||
import net.montoyo.wd.utilities.Log;
|
||||
import net.montoyo.wd.utilities.Util;
|
||||
import net.montoyo.wd.utilities.serialization.Util;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ package net.montoyo.wd.miniserv.server;
|
|||
|
||||
import net.montoyo.wd.miniserv.*;
|
||||
import net.montoyo.wd.utilities.Log;
|
||||
import net.montoyo.wd.utilities.Util;
|
||||
import net.montoyo.wd.utilities.serialization.Util;
|
||||
|
||||
import java.io.*;
|
||||
import java.nio.channels.ClosedChannelException;
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import net.minecraft.client.Minecraft;
|
|||
import net.minecraft.client.MouseHandler;
|
||||
import net.minecraft.world.InteractionHand;
|
||||
import net.minecraft.world.phys.HitResult;
|
||||
import net.montoyo.wd.init.ItemInit;
|
||||
import net.montoyo.wd.registry.ItemRegistry;
|
||||
import net.montoyo.wd.item.ItemLaserPointer;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
|
|
@ -15,21 +15,23 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|||
|
||||
@Mixin(MouseHandler.class)
|
||||
public class MouseHandlerMixin {
|
||||
@Shadow @Final private Minecraft minecraft;
|
||||
|
||||
@Inject(at = @At("HEAD"), method = "onPress", cancellable = true)
|
||||
public void prePress(long p_91531_, int p_91532_, int p_91533_, int p_91534_, CallbackInfo ci) {
|
||||
boolean flag = p_91533_ == 1;
|
||||
|
||||
if (Minecraft.getInstance().screen == null) {
|
||||
if (
|
||||
minecraft.player != null && minecraft.level != null &&
|
||||
minecraft.player.getItemInHand(InteractionHand.MAIN_HAND).getItem().equals(ItemInit.LASER_POINTER.get()) &&
|
||||
(minecraft.hitResult == null || minecraft.hitResult.getType() == HitResult.Type.BLOCK || minecraft.hitResult.getType() == HitResult.Type.MISS)
|
||||
) {
|
||||
ItemLaserPointer.press(flag, p_91532_);
|
||||
ci.cancel();
|
||||
}
|
||||
}
|
||||
}
|
||||
@Shadow
|
||||
@Final
|
||||
private Minecraft minecraft;
|
||||
|
||||
@Inject(at = @At("HEAD"), method = "onPress", cancellable = true)
|
||||
public void prePress(long p_91531_, int p_91532_, int p_91533_, int p_91534_, CallbackInfo ci) {
|
||||
boolean flag = p_91533_ == 1;
|
||||
|
||||
if (Minecraft.getInstance().screen == null) {
|
||||
if (
|
||||
minecraft.player != null && minecraft.level != null &&
|
||||
minecraft.player.getItemInHand(InteractionHand.MAIN_HAND).getItem().equals(ItemRegistry.LASER_POINTER.get()) &&
|
||||
(minecraft.hitResult == null || minecraft.hitResult.getType() == HitResult.Type.BLOCK || minecraft.hitResult.getType() == HitResult.Type.MISS)
|
||||
) {
|
||||
ItemLaserPointer.press(flag, p_91532_);
|
||||
ci.cancel();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,19 +14,19 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|||
|
||||
@Mixin(Gui.class)
|
||||
public class OverlayMixin {
|
||||
@Shadow
|
||||
@Final
|
||||
protected Minecraft minecraft;
|
||||
|
||||
@Shadow
|
||||
protected int screenWidth;
|
||||
|
||||
@Shadow
|
||||
protected int screenHeight;
|
||||
|
||||
@Inject(at = @At("HEAD"), method = "renderCrosshair", cancellable = true)
|
||||
public void preDrawCrosshair(GuiGraphics pGuiGraphics, CallbackInfo ci) {
|
||||
@Shadow
|
||||
@Final
|
||||
protected Minecraft minecraft;
|
||||
|
||||
@Shadow
|
||||
protected int screenWidth;
|
||||
|
||||
@Shadow
|
||||
protected int screenHeight;
|
||||
|
||||
@Inject(at = @At("HEAD"), method = "renderCrosshair", cancellable = true)
|
||||
public void preDrawCrosshair(GuiGraphics pGuiGraphics, CallbackInfo ci) {
|
||||
// ClientProxy.renderCrosshair(minecraft.options, screenWidth, screenHeight, ((Gui) (Object) this).getBlitOffset(), poseStack, ci);
|
||||
ClientProxy.renderCrosshair(minecraft.options, screenWidth, screenHeight, 0, pGuiGraphics, ci);
|
||||
}
|
||||
ClientProxy.renderCrosshair(minecraft.options, screenWidth, screenHeight, 0, pGuiGraphics, ci);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
package net.montoyo.wd.net;
|
||||
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
import net.montoyo.wd.utilities.Vector3i;
|
||||
import net.montoyo.wd.utilities.math.Vector3i;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.function.Consumer;
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import net.minecraft.network.FriendlyByteBuf;
|
|||
import net.minecraftforge.network.NetworkEvent;
|
||||
import net.montoyo.wd.WebDisplays;
|
||||
import net.montoyo.wd.net.Packet;
|
||||
import net.montoyo.wd.utilities.NameUUIDPair;
|
||||
import net.montoyo.wd.utilities.serialization.NameUUIDPair;
|
||||
|
||||
public class S2CMessageACResult extends Packet {
|
||||
private static NameUUIDPair[] result;
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user