Deleted old

This commit is contained in:
Tschipp 2022-12-10 18:43:42 +01:00
parent 49f3990eee
commit e306fdce7d
66 changed files with 0 additions and 7656 deletions

32
old/Jenkinsfile vendored
View File

@ -1,32 +0,0 @@
#!/usr/bin/env groovy
pipeline {
agent any
tools {
jdk "jdk-17.0.1"
}
stages {
stage('Clean') {
steps {
withCredentials([file(credentialsId: 'mod_build_secrets', variable: 'ORG_GRADLE_PROJECT_secretFile')]) {
echo 'Cleaning Project'
sh 'chmod +x gradlew'
sh './gradlew clean'
}
}
}
stage('Build and Deploy') {
steps {
withCredentials([file(credentialsId: 'mod_build_secrets', variable: 'ORG_GRADLE_PROJECT_secretFile')]) {
echo 'Building and Deploying to Maven'
sh './gradlew build publish'
}
}
}
}
post {
always {
archive 'build/libs/**.jar'
}
}
}

View File

@ -1,165 +0,0 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.

View File

@ -1,16 +0,0 @@
# Carry On [![](http://cf.way2muchnoise.eu/carry-on.svg)](https://minecraft.curseforge.com/projects/carry-on) [![](http://cf.way2muchnoise.eu/versions/carry-on.svg)](https://minecraft.curseforge.com/projects/carry-on)
To use CarryOn in your projects, include this in your build.gradle:
```
repositories {
maven {
url "https://maven.blamejared.com/"
}
}
dependencies {
deobfCompile "tschipp.carryon:carryon-MCVERSION:MODVERSION"
}
```
Make sure to replace `MCVERSION` and `MODVERSION` with the appropriate versions.

View File

@ -1,239 +0,0 @@
buildscript {
dependencies {
classpath 'org.parchmentmc:librarian:1.+'
}
}
plugins {
id 'eclipse'
id 'maven-publish'
id 'net.minecraftforge.gradle' version '5.1.+'
}
apply plugin: 'org.parchmentmc.librarian.forgegradle'
apply from: 'https://raw.githubusercontent.com/MinecraftModDevelopment/Gradle-Collection/22e7d543a18cd30675277fbfa3669e3d9e206010/generic/secrets.gradle'
apply from: 'https://raw.githubusercontent.com/SizableShrimp/Forge-Class-Remapper/main/classremapper.gradle'
//import net.minecraftforge.gradle.common.task.SignJar
import groovy.json.JsonSlurper
import groovy.json.JsonOutput
if (project.hasProperty('secretFile')) {
loadSecrets(new File((String) findProperty('secretFile')))
}
version = "${version}"
group = "tschipp.carryon"
archivesBaseName = "carryon-${minecraft_version}"
if (System.getenv('BUILD_NUMBER') != null) {
version += "." + System.getenv('BUILD_NUMBER')
}
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: "${mappings_version}"
runs {
client {
workingDirectory project.file('run')
property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP'
property 'forge.logging.console.level', 'debug'
property 'mixin.env.remapRefMap', 'true'
property 'mixin.env.refMapRemappingFile', "${buildDir}/createSrgToMcp/output.srg"
mods {
carryon {
source sourceSets.main
}
}
}
server {
workingDirectory project.file('run')
property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP'
property 'forge.logging.console.level', 'debug'
property 'mixin.env.remapRefMap', 'true'
property 'mixin.env.refMapRemappingFile', "${buildDir}/createSrgToMcp/output.srg"
mods {
carryon {
source sourceSets.main
}
}
}
data {
workingDirectory project.file('run')
property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP'
property 'forge.logging.console.level', 'debug'
args '--mod', 'carryon', '--all', '--output', file('src/generated/resources/')
mods {
carryon {
source sourceSets.main
}
}
}
}
}
repositories {
maven {
url "https://maven.blamejared.com/"
}
maven {
url "https://maven.mcmoddev.com/"
}
flatDir {
dirs 'libs'
}
maven {
url "https://www.cursemaven.com"
}
}
dependencies {
minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}"
//implementation fg.deobf("net.darkhax.gamestages:GameStages-1.16.4:6.0.1")
//implementation fg.deobf("net.darkhax.bookshelf:Bookshelf-1.16.4:9.3.18")
//implementation fg.deobf("curse.maven:obfuscate-289380:3169370")
//fileTree("libs").matching {
// include "*.jar"
//}.each {
// String filename = it.getName();
// filename = filename.substring(0, filename.length() - 4);
// int lastDash = filename.lastIndexOf("-");
// filename = filename.substring(0, lastDash) + ":" + filename.substring(lastDash+1, filename.length());
// implementation fg.deobf("blank:${filename}")
//}
}
// Example for how to get properties into the manifest for reading by the runtime..
jar {
manifest {
attributes([
"Specification-Title": "carryon",
"Specification-Vendor": "Carry On",
"Specification-Version": "1", // We are version 1 of ourselves
"Implementation-Title": project.name,
"Implementation-Version": "${version}",
"Implementation-Vendor" :"Carry On",
"Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")
])
}
}
jar.finalizedBy('reobfJar')
task sourcesJar(type: Jar, dependsOn: classes) {
description = 'Creates a JAR containing the source code.'
from sourceSets.main.allSource
classifier = 'sources'
}
task javadocJar(type: Jar, dependsOn: javadoc) {
description = 'Creates a JAR containing the JavaDocs.'
from javadoc.destinationDir
classifier = 'javadoc'
}
task deobfJar(type: Jar) {
description = 'Creates a JAR containing the non-obfuscated compiled code.'
from sourceSets.main.output
classifier = "deobf"
}
artifacts {
archives sourcesJar
archives javadocJar
archives deobfJar
}
publishing {
publications {
mavenJava(MavenPublication) {
groupId project.group
artifactId project.archivesBaseName
version project.version
from components.java
// Allows the maven pom file to be modified.
pom.withXml {
// Go through all the dependencies.
asNode().dependencies.dependency.each { dep ->
println 'Surpressing artifact ' + dep.artifactId.last().value().last() + ' from maven dependencies.'
assert dep.parent().remove(dep)
}
}
artifact sourcesJar {
classifier 'sources'
}
artifact javadocJar {
classifier 'javadoc'
}
artifact deobfJar {
classifier 'deobf'
}
}
}
repositories {
maven {
url "file://" + System.getenv("local_maven")
}
}
}
//task signJar(type: SignJar, dependsOn: jar) {
// Skips if the keyStore property is missing.
// onlyIf {
// project.hasProperty('modkeyStore')
// }
// findProperty allows us to reference the property without it existing.
// Using project.propName would cause the script to fail validation if
// the property did not exist.
// keyStore = project.findProperty('modkeyStore')
// alias = project.findProperty('modkeyStoreAlias')
// storePass = project.findProperty('modkeyStorePass')
// keyPass = project.findProperty('modkeyStoreKeyPass')
// inputFile = jar.archivePath
// outputFile = jar.archivePath
//}
// Runs this task automatically when build is ran.
//build.dependsOn signJar

View File

@ -1,9 +0,0 @@
# Sets default memory used for gradle commands. Can be overridden by user or command line properties.
# This is required to provide enough memory for the Minecraft decompilation process.
org.gradle.jvmargs=-Xmx3G
version=1.18.1
minecraft_version=1.19
mappings_version=1.19.2-2022.09.18
forge_version=41.0.100
org.gradle.daemon=false
# chorg.gradle.java.home=C:/Program Files/AdoptOpenJDK/jdk-17.0.1/

View File

@ -1,9 +0,0 @@
pluginManagement {
repositories {
gradlePluginPortal()
maven { url = 'https://maven.minecraftforge.net/' }
maven { url = 'https://maven.parchmentmc.org' }
jcenter()
mavenCentral()
}
}

View File

@ -1,79 +0,0 @@
package tschipp.carryon;
import java.io.File;
import java.util.Optional;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import net.minecraftforge.fml.config.ModConfig;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.forgespi.language.IModInfo;
import net.minecraftforge.network.NetworkDirection;
import net.minecraftforge.network.NetworkRegistry;
import net.minecraftforge.network.simple.SimpleChannel;
import tschipp.carryon.common.config.Configs;
import tschipp.carryon.common.handler.RegistrationHandler;
import tschipp.carryon.network.client.CarrySlotPacket;
import tschipp.carryon.network.client.ScriptReloadPacket;
import tschipp.carryon.network.server.SyncKeybindPacket;
import tschipp.carryon.proxy.ClientProxy;
import tschipp.carryon.proxy.IProxy;
import tschipp.carryon.proxy.ServerProxy;
@Mod(CarryOn.MODID)
@EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD)
public class CarryOn
{
public static IProxy proxy = DistExecutor.safeRunForDist(() -> ClientProxy::new, () -> ServerProxy::new);
public static final String MODID = "carryon";
public static final Logger LOGGER = LogManager.getFormatterLogger("CarryOn");
public static final String DEPENDENCIES = "required-after:forge@[13.20.1.2386,);after:gamestages;";
public static final String CERTIFICATE_FINGERPRINT = "55e88f24d04398481ae6f1ce76f65fd776f14227";
public static File CONFIGURATION_FILE;
public static boolean FINGERPRINT_VIOLATED = false;
public static SimpleChannel network;
public static IModInfo info;
public CarryOn()
{
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup);
ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, Configs.CLIENT_CONFIG);
ModLoadingContext.get().registerConfig(ModConfig.Type.SERVER, Configs.SERVER_CONFIG);
info = ModLoadingContext.get().getActiveContainer().getModInfo();
RegistrationHandler.init();
}
private void setup(final FMLCommonSetupEvent event)
{
String version = info.getVersion().toString();
// PreInitevent.
CarryOn.network = NetworkRegistry.newSimpleChannel(new ResourceLocation(CarryOn.MODID, "carryonpackets"), () -> version, version::equals, version::equals);
// CLIENT PACKETS
CarryOn.network.registerMessage(0, CarrySlotPacket.class, CarrySlotPacket::toBytes, CarrySlotPacket::new, CarrySlotPacket::handle, Optional.of(NetworkDirection.PLAY_TO_CLIENT));
CarryOn.network.registerMessage(1, ScriptReloadPacket.class, ScriptReloadPacket::toBytes, ScriptReloadPacket::new, ScriptReloadPacket::handle, Optional.of(NetworkDirection.PLAY_TO_CLIENT));
// SERVER PACKETS
CarryOn.network.registerMessage(2, SyncKeybindPacket.class, SyncKeybindPacket::toBytes, SyncKeybindPacket::new, SyncKeybindPacket::handle, Optional.of(NetworkDirection.PLAY_TO_SERVER));
RegistrationHandler.regCommonEvents();
// Init
RegistrationHandler.regOverrideList();
proxy.setup(event);
}
}

View File

@ -1,157 +0,0 @@
package tschipp.carryon.client.event;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Vector3f;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.client.event.RenderHandEvent;
import net.minecraftforge.event.level.LevelEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.ModList;
import tschipp.carryon.client.helper.CarryRenderHelper;
import tschipp.carryon.common.handler.RegistrationHandler;
import tschipp.carryon.common.item.ItemCarryonEntity;
import tschipp.carryon.common.scripting.CarryOnOverride;
import tschipp.carryon.common.scripting.ScriptChecker;
public class RenderEntityEvents
{
public static final Map<String, Entity> nbtEntityMap = new HashMap<>();
public static Entity getEntity(ItemStack carried, Level level)
{
String nbt = ItemCarryonEntity.getPersistentData(carried).toString();
if (nbtEntityMap.containsKey(nbt))
{
return nbtEntityMap.get(nbt);
}
Entity entity = ItemCarryonEntity.getEntity(carried, level);
nbtEntityMap.put(nbt, entity);
return entity;
}
@OnlyIn(Dist.CLIENT)
@SubscribeEvent
public void onLevelUnload(LevelEvent.Unload event)
{
nbtEntityMap.clear();
}
/*
* Renders the Entity in First Person
*/
@SuppressWarnings("resource")
@OnlyIn(Dist.CLIENT)
@SubscribeEvent
public void renderHand(RenderHandEvent event)
{
Level level = Minecraft.getInstance().level;
Player player = Minecraft.getInstance().player;
ItemStack stack = player.getMainHandItem();
int perspective = CarryRenderHelper.getPerspective();
float partialticks = event.getPartialTick();
PoseStack matrix = event.getPoseStack();
int light = event.getPackedLight();
MultiBufferSource buffer = event.getMultiBufferSource();
EntityRenderDispatcher manager = Minecraft.getInstance().getEntityRenderDispatcher();
if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemEntity.get() && ItemCarryonEntity.hasEntityData(stack))
{
if (ModList.get().isLoaded("realrender") || ModList.get().isLoaded("rfpr"))
return;
Entity entity = getEntity(stack, level);
if (entity != null)
{
Vec3 playerpos = CarryRenderHelper.getExactPos(player, partialticks);
entity.setPos(playerpos.x, playerpos.y, playerpos.z);
entity.xRotO = 0.0f;
entity.yRotO = 0.0f;
entity.setYHeadRot(0.0f);
float height = entity.getBbHeight();
float width = entity.getBbWidth();
matrix.pushPose();
matrix.scale(0.8f, 0.8f, 0.8f);
matrix.mulPose(Vector3f.YP.rotationDegrees(180));
matrix.translate(0.0, -height - .1, width + 0.1);
// RenderSystem.enableAlphaTest();
if (perspective == 0)
{
// Lighting.en
manager.setRenderShadow(false);
CarryOnOverride carryOverride = ScriptChecker.getOverride(player);
if (carryOverride != null)
{
CarryRenderHelper.performOverrideTransformation(matrix, carryOverride);
String entityname = carryOverride.getRenderNameEntity();
if (entityname != null)
{
Entity newEntity = null;
Optional<EntityType<?>> type = EntityType.byString(entityname);
if (type.isPresent())
newEntity = type.get().create(level);
if (newEntity != null)
{
CompoundTag nbttag = carryOverride.getRenderNBT();
if (nbttag != null)
newEntity.deserializeNBT(nbttag);
entity = newEntity;
entity.setPos(playerpos.x, playerpos.y, playerpos.z);
entity.xRotO = 0.0f;
entity.yRotO = 0.0f;
entity.setYHeadRot(0.0f);
}
}
}
if (entity instanceof LivingEntity)
((LivingEntity) entity).hurtTime = 0;
manager.render(entity, 0, 0, 0, 0f, 0, matrix, buffer, light);
manager.setRenderShadow(true);
}
// RenderSystem.disableAlphaTest();
matrix.popPose();
// Lighting.turnOff();
// TODO
// RenderSystem.disableRescaleNormal();
if (perspective == 0)
{
event.setCanceled(true);
}
}
}
}
}

View File

@ -1,796 +0,0 @@
package tschipp.carryon.client.event;
import java.lang.reflect.InvocationTargetException;
import java.util.Optional;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.Tesselator;
import com.mojang.blaze3d.vertex.VertexConsumer;
import com.mojang.math.Quaternion;
import com.mojang.math.Vector3f;
import net.minecraft.ChatFormatting;
import net.minecraft.client.KeyMapping;
import net.minecraft.client.Minecraft;
import net.minecraft.client.Options;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.client.model.PlayerModel;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.player.AbstractClientPlayer;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.MultiBufferSource.BufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
import net.minecraft.client.renderer.entity.player.PlayerRenderer;
import net.minecraft.client.renderer.texture.TextureAtlas;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.ClickEvent;
import net.minecraft.network.chat.ClickEvent.Action;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.Pose;
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.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.client.event.RenderHandEvent;
import net.minecraftforge.client.event.RenderLevelLastEvent;
import net.minecraftforge.client.event.RenderPlayerEvent;
import net.minecraftforge.client.event.ScreenEvent;
import net.minecraftforge.event.TickEvent.PlayerTickEvent;
import net.minecraftforge.event.entity.EntityJoinLevelEvent;
import net.minecraftforge.eventbus.api.EventPriority;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.LogicalSide;
import net.minecraftforge.fml.ModList;
import tschipp.carryon.CarryOn;
import tschipp.carryon.client.helper.CarryRenderHelper;
import tschipp.carryon.client.keybinds.CarryOnKeybinds;
import tschipp.carryon.common.config.Configs.Settings;
import tschipp.carryon.common.handler.ModelOverridesHandler;
import tschipp.carryon.common.handler.RegistrationHandler;
import tschipp.carryon.common.helper.KeyboardCallbackWrapper.KeyPressedEvent;
import tschipp.carryon.common.helper.ScriptParseHelper;
import tschipp.carryon.common.helper.ScrollCallbackWrapper.MouseScrolledEvent;
import tschipp.carryon.common.helper.StringParser;
import tschipp.carryon.common.item.ItemCarryonBlock;
import tschipp.carryon.common.item.ItemCarryonEntity;
import tschipp.carryon.common.scripting.CarryOnOverride;
import tschipp.carryon.common.scripting.ScriptChecker;
import tschipp.carryon.network.server.SyncKeybindPacket;
public class RenderEvents
{
/*
* Prevents the Player from scrolling
*/
@OnlyIn(Dist.CLIENT)
@SubscribeEvent
public void onScroll(MouseScrolledEvent event)
{
@SuppressWarnings("resource")
Player player = Minecraft.getInstance().player;
if (player != null)
{
ItemStack stack = player.getMainHandItem();
if (!stack.isEmpty() && (stack.getItem() == RegistrationHandler.itemTile.get() || stack.getItem() == RegistrationHandler.itemEntity.get()))
{
if (ItemCarryonBlock.hasTileData(stack) || ItemCarryonEntity.hasEntityData(stack))
{
event.setCanceled(true);
}
}
}
}
@SubscribeEvent
@OnlyIn(Dist.CLIENT)
public void onPlayerTick(PlayerTickEvent event) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException
{
Player player = event.player;
if (player != null && event.side == LogicalSide.CLIENT)
{
boolean keyPressed = CarryOnKeybinds.carryKey.isDown();
boolean playerKeyPressed = CarryOnKeybinds.isKeyPressed(player);
if (keyPressed && !playerKeyPressed)
{
CarryOnKeybinds.setKeyPressed(player, true);
CarryOn.network.sendToServer(new SyncKeybindPacket(true));
}
else if (!keyPressed && playerKeyPressed)
{
CarryOnKeybinds.setKeyPressed(player, false);
CarryOn.network.sendToServer(new SyncKeybindPacket(false));
}
}
}
@SubscribeEvent
@OnlyIn(Dist.CLIENT)
public void onJoinLevel(EntityJoinLevelEvent event)
{
if (event.getEntity() instanceof Player)
{
Player player = (Player) event.getEntity();
if (player.level.isClientSide)
{
CarryOnKeybinds.setKeyPressed(player, false);
CarryOn.network.sendToServer(new SyncKeybindPacket(false));
if (CarryOn.FINGERPRINT_VIOLATED)
{
Component cf = Component.literal(ChatFormatting.AQUA + "Curseforge" + ChatFormatting.RED);
cf.getStyle().withClickEvent(new ClickEvent(Action.OPEN_URL, "https://minecraft.curseforge.com/projects/carry-on"));
player.displayClientMessage(Component.literal(ChatFormatting.RED + "[CarryOn] WARNING! Invalid fingerprint detected! The Carry On mod file may have been tampered with! If you didn't download the file from ").append(cf).append(ChatFormatting.RED + " or through any kind of mod launcher, immediately delete the file and re-download it from ").append(cf), false);
}
}
}
}
/*
* Prevents the Player from opening Guis
*/
@SuppressWarnings("resource")
@OnlyIn(Dist.CLIENT)
@SubscribeEvent
public void onGuiInit(ScreenEvent.Init.Pre event)
{
if (event.getScreen() != null)
{
boolean inventory = event.getScreen() instanceof AbstractContainerScreen;
Player player = Minecraft.getInstance().player;
if (player != null && inventory)
{
ItemStack stack = player.getItemInHand(InteractionHand.MAIN_HAND);
if (!stack.isEmpty() && (stack.getItem() == RegistrationHandler.itemTile.get() && ItemCarryonBlock.hasTileData(stack) || stack.getItem() == RegistrationHandler.itemEntity.get() && ItemCarryonEntity.hasEntityData(stack)))
{
Minecraft.getInstance().player.closeContainer();
Minecraft.getInstance().screen = null;
Minecraft.getInstance().mouseHandler.grabMouse();
}
}
}
}
/*
* Prevents the Player from switching Slots
*/
@SuppressWarnings("resource")
@OnlyIn(Dist.CLIENT)
@SubscribeEvent
public void inputEvent(KeyPressedEvent event) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException
{
Options settings = Minecraft.getInstance().options;
int key = event.key;
int scancode = event.scancode;
Player player = Minecraft.getInstance().player;
if (player != null)
{
ItemStack stack = Minecraft.getInstance().player.getMainHandItem();
if (!stack.isEmpty() && (stack.getItem() == RegistrationHandler.itemTile.get() && ItemCarryonBlock.hasTileData(stack) || stack.getItem() == RegistrationHandler.itemEntity.get() && ItemCarryonEntity.hasEntityData(stack)))
{
if (settings.keyDrop.matches(key, scancode))
{
event.setCanceled(true);
}
if (settings.keySwapOffhand.matches(key, scancode))
{
event.setCanceled(true);
}
if (settings.keyPickItem.matches(key, scancode))
{
event.setCanceled(true);
}
for (KeyMapping keyBind : settings.keyHotbarSlots)
{
if (keyBind.matches(key, scancode))
{
event.setCanceled(true);
}
}
}
int current = player.getInventory().selected;
if (player.getPersistentData().contains("carrySlot") ? player.getPersistentData().getInt("carrySlot") != current : false)
{
player.getInventory().selected = player.getPersistentData().getInt("carrySlot");
}
}
}
/*
* Renders the Block in First Person
*/
@SuppressWarnings({ "resource", "deprecation" })
@OnlyIn(Dist.CLIENT)
@SubscribeEvent
public void renderHand(RenderHandEvent event)
{
Level level = Minecraft.getInstance().level;
Player player = Minecraft.getInstance().player;
ItemStack stack = player.getMainHandItem();
int perspective = CarryRenderHelper.getPerspective();
boolean f1 = Minecraft.getInstance().options.hideGui;
MultiBufferSource buffer = event.getMultiBufferSource();
PoseStack matrix = event.getPoseStack();
int light = event.getPackedLight();
if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile.get() && ItemCarryonBlock.hasTileData(stack) && perspective == 0 && !f1)
{
if (ModList.get().isLoaded("realrender") || ModList.get().isLoaded("rfpr"))
return;
Block block = ItemCarryonBlock.getBlock(stack);
CompoundTag tag = ItemCarryonBlock.getTileData(stack);
BlockState state = ItemCarryonBlock.getBlockState(stack);
ItemStack tileStack = ItemCarryonBlock.getItemStack(stack);
matrix.pushPose();
matrix.scale(2.5f, 2.5f, 2.5f);
matrix.translate(0, -0.5, -1);
RenderSystem.enableBlend();
RenderSystem.disableCull();
if (Settings.facePlayer.get() ? !isChest(block) : isChest(block))
{
matrix.mulPose(Vector3f.YP.rotationDegrees(180));
matrix.mulPose(Vector3f.XN.rotationDegrees(8));
}
else
{
matrix.mulPose(Vector3f.XP.rotationDegrees(8));
}
BakedModel model = ModelOverridesHandler.hasCustomOverrideModel(state, tag) ? ModelOverridesHandler.getCustomOverrideModel(state, tag, level, player) : tileStack.isEmpty() ? Minecraft.getInstance().getBlockRenderer().getBlockModel(state) : Minecraft.getInstance().getItemRenderer().getModel(tileStack, level, player, 0);
CarryOnOverride carryOverride = ScriptChecker.getOverride(player);
if (carryOverride != null)
{
CarryRenderHelper.performOverrideTransformation(matrix, carryOverride);
if (!carryOverride.getRenderNameBlock().isEmpty())
{
Block b = StringParser.getBlock(carryOverride.getRenderNameBlock());
if (b != null)
{
ItemStack s = new ItemStack(b, 1);
s.setTag(carryOverride.getRenderNBT());
model = Minecraft.getInstance().getItemRenderer().getModel(s, level, player, 0);
}
}
}
RenderSystem.setShaderTexture(0, TextureAtlas.LOCATION_BLOCKS);
CarryRenderHelper.renderItem(state, tag, stack, tileStack, matrix, buffer, light, model);
if (perspective == 0)
{
event.setCanceled(true);
}
RenderSystem.enableCull();
RenderSystem.disableBlend();
matrix.popPose();
}
}
// @SubscribeEvent
// public void onJoinServer(LoggedInEvent event)
// {
// ListHandler.initConfigLists();
// }
/*
* Render blocks and entities in third person
*/
@SuppressWarnings({ "deprecation", "resource" })
@OnlyIn(Dist.CLIENT)
@SubscribeEvent
public void onRenderLevel(RenderLevelLastEvent event)
{
Minecraft mc = Minecraft.getInstance();
Level level = mc.level;
float partialticks = event.getPartialTick();
BufferSource buffer = MultiBufferSource.immediate(Tesselator.getInstance().getBuilder());
PoseStack matrix = event.getPoseStack();
int light = 0;
int perspective = CarryRenderHelper.getPerspective();
EntityRenderDispatcher manager = mc.getEntityRenderDispatcher();
RenderSystem.enableBlend();
RenderSystem.disableCull();
RenderSystem.disableDepthTest();
for (Player player : level.players())
{
if (perspective == 0 && player == mc.player)
continue;
light = manager.getPackedLightCoords(player, partialticks);
ItemStack stack = player.getMainHandItem();
if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile.get() && ItemCarryonBlock.hasTileData(stack))
{
Block block = ItemCarryonBlock.getBlock(stack);
BlockState state = ItemCarryonBlock.getBlockState(stack);
CompoundTag tag = ItemCarryonBlock.getTileData(stack);
ItemStack tileItem = ItemCarryonBlock.getItemStack(stack);
applyBlockTransformations(player, partialticks, matrix, block);
BakedModel model = ModelOverridesHandler.hasCustomOverrideModel(state, tag) ? ModelOverridesHandler.getCustomOverrideModel(state, tag, level, player) : tileItem.isEmpty() ? mc.getBlockRenderer().getBlockModel(state) : mc.getItemRenderer().getModel(tileItem, level, player, 0);
CarryOnOverride carryOverride = ScriptChecker.getOverride(player);
if (carryOverride != null)
{
CarryRenderHelper.performOverrideTransformation(matrix, carryOverride);
if (!carryOverride.getRenderNameBlock().isEmpty())
{
Block b = StringParser.getBlock(carryOverride.getRenderNameBlock());
if (b != null)
{
ItemStack s = new ItemStack(b, 1);
s.setTag(carryOverride.getRenderNBT());
model = mc.getItemRenderer().getModel(s, level, player, 0);
}
}
}
RenderSystem.setShaderTexture(0, TextureAtlas.LOCATION_BLOCKS);
RenderSystem.enableCull();
PoseStack.Pose p = matrix.last();
PoseStack copy = new PoseStack();
copy.mulPoseMatrix(p.pose());
matrix.popPose();
drawArms(player, partialticks, matrix, buffer, light);
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
CarryRenderHelper.renderItem(state, tag, stack, tileItem, copy, buffer, light, model);
buffer.endBatch();
matrix.popPose();
}
else if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemEntity.get() && ItemCarryonEntity.hasEntityData(stack))
{
Entity entity = RenderEntityEvents.getEntity(stack, level);
if (entity != null)
{
applyEntityTransformations(player, partialticks, matrix, entity);
manager.setRenderShadow(false);
CarryOnOverride carryOverride = ScriptChecker.getOverride(player);
if (carryOverride != null)
{
CarryRenderHelper.performOverrideTransformation(matrix, carryOverride);
String entityname = carryOverride.getRenderNameEntity();
if (entityname != null)
{
Entity newEntity = null;
Optional<EntityType<?>> type = EntityType.byString(entityname);
if (type.isPresent())
newEntity = type.get().create(level);
if (newEntity != null)
{
CompoundTag nbttag = carryOverride.getRenderNBT();
if (nbttag != null)
newEntity.deserializeNBT(nbttag);
entity = newEntity;
entity.yo = 0.0f;
entity.yRotO = 0.0f;
entity.setYHeadRot(0.0f);
entity.xo = 0.0f;
entity.xRotO = 0.0f;
}
}
}
if (entity instanceof LivingEntity le)
le.hurtTime = 0;
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
manager.render(entity, 0, 0, 0, 0f, 0, matrix, buffer, light);
buffer.endBatch();
matrix.popPose();
drawArms(player, partialticks, matrix, buffer, light);
manager.setRenderShadow(true);
matrix.popPose();
}
}
}
RenderSystem.enableDepthTest();
RenderSystem.enableCull();
RenderSystem.disableBlend();
}
@SuppressWarnings("resource")
private void applyGeneralTransformations(Player player, float partialticks, PoseStack matrix)
{
int perspective = CarryRenderHelper.getPerspective();
Quaternion playerrot = CarryRenderHelper.getExactBodyRotation(player, partialticks);
Vec3 playerpos = CarryRenderHelper.getExactPos(player, partialticks);
Vec3 cameraPos = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition();
Vec3 offset = playerpos.subtract(cameraPos);
Pose pose = player.getPose();
matrix.pushPose();
matrix.translate(offset.x, offset.y, offset.z);
if (perspective == 2)
playerrot.mul(Vector3f.YP.rotationDegrees(180));
matrix.mulPose(playerrot);
matrix.pushPose();
matrix.scale(0.6f, 0.6f, 0.6f);
if (perspective == 2)
matrix.translate(0, 0, -1.35);
if (doSneakCheck(player))
{
matrix.translate(0, -0.4, 0);
}
if (pose == Pose.SWIMMING)
{
float f = player.getSwimAmount(partialticks);
float f3 = player.isInWater() ? -90.0F - player.xRotO : -90.0F;
float f4 = Mth.lerp(f, 0.0F, f3);
if (perspective == 2)
{
matrix.translate(0, 0, 1.35);
matrix.mulPose(Vector3f.XP.rotationDegrees(f4));
}
else
matrix.mulPose(Vector3f.XN.rotationDegrees(f4));
matrix.translate(0, -1.5, -1.848);
if (perspective == 2)
matrix.translate(0, 0, 2.38);
}
if (pose == Pose.FALL_FLYING)
{
float f1 = player.getFallFlyingTicks() + partialticks;
float f2 = Mth.clamp(f1 * f1 / 100.0F, 0.0F, 1.0F);
if (!player.isAutoSpinAttack())
{
if (perspective == 2)
matrix.translate(0, 0, 1.35);
if (perspective == 2)
matrix.mulPose(Vector3f.XP.rotationDegrees(f2 * (-90.0F - player.xRotO)));
else
matrix.mulPose(Vector3f.XN.rotationDegrees(f2 * (-90.0F - player.xRotO)));
}
Vec3 Vector3d = player.getViewVector(partialticks);
Vec3 Vector3d1 = player.getDeltaMovement();
double d0 = Vector3d1.horizontalDistanceSqr();
double d1 = Vector3d1.horizontalDistanceSqr();
if (d0 > 0.0D && d1 > 0.0D)
{
double d2 = (Vector3d1.x * Vector3d.x + Vector3d1.z * Vector3d.z) / (Math.sqrt(d0) * Math.sqrt(d1));
double d3 = Vector3d1.x * Vector3d.z - Vector3d1.z * Vector3d.x;
matrix.mulPose(Vector3f.YP.rotation((float) (Math.signum(d3) * Math.acos(d2))));
}
if (perspective != 2)
matrix.translate(0, 0, -1.35);
matrix.translate(0, -0.2, 0);
}
matrix.translate(0, 1.6, 0.65);
}
private void applyBlockTransformations(Player player, float partialticks, PoseStack matrix, Block block)
{
int perspective = CarryRenderHelper.getPerspective();
applyGeneralTransformations(player, partialticks, matrix);
if (Settings.facePlayer.get() ? !isChest(block) : isChest(block))
{
if ((ModList.get().isLoaded("realrender") || ModList.get().isLoaded("rfpr")) && perspective == 0)
matrix.translate(0, 0, -0.4);
matrix.mulPose(Vector3f.YP.rotationDegrees(180));
}
else if ((ModList.get().isLoaded("realrender") || ModList.get().isLoaded("rfpr")) && perspective == 0)
matrix.translate(0, 0, 0.4);
}
private void applyEntityTransformations(Player player, float partialticks, PoseStack matrix, Entity entity)
{
int perspective = CarryRenderHelper.getPerspective();
Pose pose = player.getPose();
applyGeneralTransformations(player, partialticks, matrix);
if (perspective == 2)
matrix.translate(0, -1.6, 0.65);
else
matrix.translate(0, -1.6, -0.65);
matrix.scale(1.666f, 1.666f, 1.666f);
float height = entity.getBbHeight();
float width = entity.getBbWidth();
float multiplier = height * width;
entity.yo = 0.0f;
entity.yRotO = 0.0f;
entity.setYHeadRot(0.0f);
entity.xo = 0.0f;
entity.xRotO = 0.0f;
if (perspective == 2)
matrix.mulPose(Vector3f.YP.rotationDegrees(180));
matrix.scale((10 - multiplier) * 0.08f, (10 - multiplier) * 0.08f, (10 - multiplier) * 0.08f);
matrix.translate(0.0, height / 2 + -(height / 2) + 1, width - 0.1 < 0.7 ? width - 0.1 + (0.7 - (width - 0.1)) : width - 0.1);
if (pose == Pose.SWIMMING || pose == Pose.FALL_FLYING)
{
matrix.mulPose(Vector3f.XN.rotationDegrees(90));
matrix.translate(0, -0.2 * height, 0);
if (pose == Pose.FALL_FLYING)
matrix.translate(0, 0, 0.2);
}
}
/*
* Renders correct arm rotation
*/
@OnlyIn(Dist.CLIENT)
public void drawArms(Player player, float partialticks, PoseStack matrix, MultiBufferSource buffer, int light)
{
int perspective = CarryRenderHelper.getPerspective();
Pose pose = player.getPose();
if (!Settings.renderArms.get() || pose == Pose.SWIMMING || pose == Pose.FALL_FLYING)
return;
if (handleMobends() && !ModList.get().isLoaded("obfuscate"))
{
ItemStack stack = player.getMainHandItem();
if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile.get() && ItemCarryonBlock.hasTileData(stack) || stack.getItem() == RegistrationHandler.itemEntity.get() && ItemCarryonEntity.hasEntityData(stack))
{
PlayerModel<AbstractClientPlayer> model = getPlayerModel((AbstractClientPlayer) player);
AbstractClientPlayer aplayer = (AbstractClientPlayer) player;
ResourceLocation skinLoc = aplayer.getSkinTextureLocation();
matrix.pushPose();
if (perspective == 2)
matrix.mulPose(Vector3f.YP.rotationDegrees(180));
RenderSystem.setShaderTexture(0, skinLoc);
CarryOnOverride overrider = ScriptChecker.getOverride(player);
VertexConsumer builder = buffer.getBuffer(RenderType.entityCutout(skinLoc));
if (overrider != null)
{
float[] rotLeft = null;
float[] rotRight = null;
if (!overrider.getRenderRotationLeftArm().isEmpty())
rotLeft = ScriptParseHelper.getXYZArray(overrider.getRenderRotationLeftArm());
if (!overrider.getRenderRotationRightArm().isEmpty())
rotRight = ScriptParseHelper.getXYZArray(overrider.getRenderRotationRightArm());
boolean renderRight = overrider.isRenderRightArm();
boolean renderLeft = overrider.isRenderLeftArm();
if (renderLeft && rotLeft != null)
{
renderArmPost(model.leftArm, rotLeft[0], rotLeft[2], false, doSneakCheck(player), light, matrix, builder);
renderArmPost(model.leftSleeve, rotLeft[0], rotLeft[2], false, doSneakCheck(player), light, matrix, builder);
}
else if (renderLeft)
{
renderArmPost(model.leftArm, 2.0F + (doSneakCheck(player) ? 0f : 0.2f) - (stack.getItem() == RegistrationHandler.itemEntity.get() ? 0.3f : 0), stack.getItem() == RegistrationHandler.itemEntity.get() ? 0.15f : 0, false, doSneakCheck(player), light, matrix, builder);
renderArmPost(model.leftSleeve, 2.0F + (doSneakCheck(player) ? 0f : 0.2f) - (stack.getItem() == RegistrationHandler.itemEntity.get() ? 0.3f : 0), stack.getItem() == RegistrationHandler.itemEntity.get() ? 0.15f : 0, false, doSneakCheck(player), light, matrix, builder);
}
if (renderRight && rotRight != null)
{
renderArmPost(model.rightArm, rotRight[0], rotRight[2], true, doSneakCheck(player), light, matrix, builder);
renderArmPost(model.rightSleeve, rotRight[0], rotRight[2], true, doSneakCheck(player), light, matrix, builder);
}
else if (renderRight)
{
renderArmPost(model.rightArm, 2.0F + (doSneakCheck(player) ? 0f : 0.2f) - (stack.getItem() == RegistrationHandler.itemEntity.get() ? 0.3f : 0), stack.getItem() == RegistrationHandler.itemEntity.get() ? -0.15f : 0, true, doSneakCheck(player), light, matrix, builder);
renderArmPost(model.rightSleeve, 2.0F + (doSneakCheck(player) ? 0f : 0.2f) - (stack.getItem() == RegistrationHandler.itemEntity.get() ? 0.3f : 0), stack.getItem() == RegistrationHandler.itemEntity.get() ? -0.15f : 0, true, doSneakCheck(player), light, matrix, builder);
}
}
else
{
renderArmPost(model.rightArm, 2.0F + (doSneakCheck(player) ? 0f : 0.2f) - (stack.getItem() == RegistrationHandler.itemEntity.get() ? 0.3f : 0), stack.getItem() == RegistrationHandler.itemEntity.get() ? -0.15f : 0, true, doSneakCheck(player), light, matrix, builder);
renderArmPost(model.leftArm, 2.0F + (doSneakCheck(player) ? 0f : 0.2f) - (stack.getItem() == RegistrationHandler.itemEntity.get() ? 0.3f : 0), stack.getItem() == RegistrationHandler.itemEntity.get() ? 0.15f : 0, false, doSneakCheck(player), light, matrix, builder);
renderArmPost(model.leftSleeve, 2.0F + (doSneakCheck(player) ? 0f : 0.2f) - (stack.getItem() == RegistrationHandler.itemEntity.get() ? 0.3f : 0), stack.getItem() == RegistrationHandler.itemEntity.get() ? 0.15f : 0, false, doSneakCheck(player), light, matrix, builder);
renderArmPost(model.rightSleeve, 2.0F + (doSneakCheck(player) ? 0f : 0.2f) - (stack.getItem() == RegistrationHandler.itemEntity.get() ? 0.3f : 0), stack.getItem() == RegistrationHandler.itemEntity.get() ? -0.15f : 0, true, doSneakCheck(player), light, matrix, builder);
}
if (buffer instanceof BufferSource)
((BufferSource) buffer).endBatch();
matrix.popPose();
}
}
}
/*
* Hides the vanilla arm for rendering the rotation
*/
@OnlyIn(Dist.CLIENT)
@SubscribeEvent(priority = EventPriority.NORMAL)
public void onEvent(RenderPlayerEvent.Pre event)
{
if (!Settings.renderArms.get())
return;
if (handleMobends() && !ModList.get().isLoaded("obfuscate"))
{
Player player = event.getEntity();
Pose pose = player.getPose();
ItemStack stack = player.getMainHandItem();
if (pose != Pose.SWIMMING && pose != Pose.FALL_FLYING && !stack.isEmpty() && (stack.getItem() == RegistrationHandler.itemTile.get() && ItemCarryonBlock.hasTileData(stack) || stack.getItem() == RegistrationHandler.itemEntity.get() && ItemCarryonEntity.hasEntityData(stack)))
{
PlayerModel<AbstractClientPlayer> model = event.getRenderer().getModel();
CarryOnOverride overrider = ScriptChecker.getOverride(player);
if (overrider != null)
{
boolean renderRight = overrider.isRenderRightArm();
boolean renderLeft = overrider.isRenderLeftArm();
if (renderRight)
{
renderArmPre(model.rightArm);
renderArmPre(model.rightSleeve);
}
if (renderLeft)
{
renderArmPre(model.leftArm);
renderArmPre(model.leftSleeve);
}
}
else
{
renderArmPre(model.rightArm);
renderArmPre(model.leftArm);
renderArmPre(model.leftSleeve);
renderArmPre(model.rightSleeve);
}
}
}
}
@OnlyIn(Dist.CLIENT)
private void renderArmPost(ModelPart arm, float x, float z, boolean right, boolean sneaking, int light, PoseStack matrix, VertexConsumer builder)
{
matrix.pushPose();
arm.visible = true;
if (right)
matrix.translate(0.015, 0, 0);
else
matrix.translate(-0.015, 0, 0);
if (!sneaking)
arm.y = 20;
else
arm.y = 15;
arm.xRot = x;
arm.yRot = 0;
arm.zRot = -z;
arm.render(matrix, builder, light, 655360);
arm.y = 2;
matrix.popPose();
}
@OnlyIn(Dist.CLIENT)
private void renderArmPre(ModelPart arm)
{
arm.visible = false;
}
public boolean handleMobends()
{
// TODO MOBENDS
// if (ModList.get().isLoaded("mobends"))
// {
// Configuration config = new Configuration(new
// File(CarryOn.CONFIGURATION_FILE.getPath().substring(0,
// CarryOn.CONFIGURATION_FILE.getPath().length() - 16), "mobends.cfg"));
//
// boolean renderPlayer = config.get("animated", "player",
// true).getBoolean();
// return !renderPlayer;
// }
return true;
}
public static boolean doSneakCheck(Player player)
{
if (player.getAbilities().flying)
return false;
return player.isShiftKeyDown() || player.isCrouching();
}
public static boolean isChest(Block block)
{
return block == Blocks.CHEST || block == Blocks.ENDER_CHEST || block == Blocks.TRAPPED_CHEST;
}
@OnlyIn(Dist.CLIENT)
private static PlayerRenderer getRenderPlayer(AbstractClientPlayer player)
{
Minecraft mc = Minecraft.getInstance();
EntityRenderDispatcher manager = mc.getEntityRenderDispatcher();
return (PlayerRenderer) manager.getSkinMap().get(player.getModelName());
}
@OnlyIn(Dist.CLIENT)
private static PlayerModel<AbstractClientPlayer> getPlayerModel(AbstractClientPlayer player)
{
return getRenderPlayer(player).getModel();
}
// @SubscribeEvent
// @OnlyIn(Dist.CLIENT)
// public void hideItems(RenderSpecificHandEvent event)
// {
// ItemStack stack = event.getItemStack();
//
// if (stack != null && (stack.getItem() == RegistrationHandler.itemTile.get() ||
// stack.getItem() == RegistrationHandler.itemEntity.get()))
// {
// event.setCanceled(true);
// }
// }
}

View File

@ -1,90 +0,0 @@
package tschipp.carryon.client.helper;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Quaternion;
import com.mojang.math.Vector3f;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.block.model.ItemTransforms.TransformType;
import net.minecraft.client.renderer.entity.ItemRenderer;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
import tschipp.carryon.common.handler.ModelOverridesHandler;
import tschipp.carryon.common.helper.ScriptParseHelper;
import tschipp.carryon.common.scripting.CarryOnOverride;
public class CarryRenderHelper
{
public static Vec3 getExactPos(Entity entity, float partialticks)
{
return new Vec3(entity.xOld + (entity.getX() - entity.xOld) * partialticks, entity.yOld + (entity.getY() - entity.yOld) * partialticks, entity.zOld + (entity.getZ() - entity.zOld) * partialticks);
}
public static float getExactBodyRotationDegrees(LivingEntity entity, float partialticks)
{
if (entity.getVehicle() != null && entity.getVehicle() instanceof LivingEntity)
return -(entity.yHeadRotO + (entity.yHeadRot - entity.yHeadRotO) * partialticks);
else
return -(entity.yBodyRotO + (entity.yBodyRot - entity.yBodyRotO) * partialticks);
}
public static Quaternion getExactBodyRotation(LivingEntity entity, float partialticks)
{
return Vector3f.YP.rotationDegrees(getExactBodyRotationDegrees(entity, partialticks));
}
public static void performOverrideTransformation(PoseStack matrix, CarryOnOverride override)
{
int perspective = getPerspective();
float[] translation = ScriptParseHelper.getXYZArray(override.getRenderTranslation());
float[] rotation = ScriptParseHelper.getXYZArray(override.getRenderRotation());
float[] scaled = ScriptParseHelper.getScaled(override.getRenderScaled());
Quaternion rot = Vector3f.XP.rotationDegrees(rotation[0]);
rot.mul(Vector3f.YP.rotationDegrees(rotation[1]));
rot.mul(Vector3f.ZP.rotationDegrees(rotation[2]));
matrix.mulPose(rot);
matrix.translate(translation[0], translation[1], perspective == 1 && override.isBlock() ? -translation[2] : translation[2]);
matrix.scale(scaled[0], scaled[1], scaled[2]);
}
public static void renderItem(BlockState state, CompoundTag tag, ItemStack stack, ItemStack tileStack, PoseStack matrix, MultiBufferSource buffer, int light, BakedModel model)
{
ItemRenderer renderer = Minecraft.getInstance().getItemRenderer();
if (ModelOverridesHandler.hasCustomOverrideModel(state, tag))
{
Object override = ModelOverridesHandler.getOverrideObject(state, tag);
if (override instanceof ItemStack)
{
renderer.render((ItemStack) override, TransformType.NONE, false, matrix, buffer, light, OverlayTexture.NO_OVERLAY, model);
return;
}
}
renderer.render(tileStack.isEmpty() ? stack : tileStack, TransformType.NONE, false, matrix, buffer, light, OverlayTexture.NO_OVERLAY, model);
}
@SuppressWarnings("resource")
public static int getPerspective()
{
boolean isThirdPerson = !Minecraft.getInstance().options.getCameraType().isFirstPerson(); // isThirdPerson
boolean isThirdPersonReverse = Minecraft.getInstance().options.getCameraType().isMirrored();
if (!isThirdPerson && !isThirdPersonReverse)
return 0;
if (isThirdPerson && !isThirdPersonReverse)
return 1;
return 2;
}
}

View File

@ -1,45 +0,0 @@
package tschipp.carryon.client.keybinds;
import net.minecraft.client.KeyMapping;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.entity.player.Player;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.RegisterKeyMappingsEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus;
import tschipp.carryon.CarryOn;
@EventBusSubscriber(modid = CarryOn.MODID, bus = Bus.MOD, value = Dist.CLIENT)
public class CarryOnKeybinds
{
public static final String KEYBIND_KEY = "carryOnKeyPressed";
public static KeyMapping carryKey;
@SubscribeEvent
public static void registerKeybinds(RegisterKeyMappingsEvent event)
{
carryKey = new KeyMapping("key.carry.desc", 340, "key.carry.category");
event.register(carryKey);
}
public static boolean isKeyPressed(Player player)
{
CompoundTag tag = player.getPersistentData();
if (tag != null && tag.contains(KEYBIND_KEY))
{
return tag.getBoolean(KEYBIND_KEY);
}
return false;
}
public static void setKeyPressed(Player player, boolean pressed)
{
CompoundTag tag = player.getPersistentData();
tag.putBoolean(KEYBIND_KEY, pressed);
}
}

View File

@ -1,16 +0,0 @@
package tschipp.carryon.common.capabilities;
import net.minecraft.core.BlockPos;
public interface IPosition
{
public BlockPos getPos();
public void setPos(BlockPos pos);
public boolean isBlockActivated();
public void setBlockActivated(boolean b);
}

View File

@ -1,57 +0,0 @@
package tschipp.carryon.common.capabilities;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.CapabilityManager;
import net.minecraftforge.common.capabilities.CapabilityToken;
import net.minecraftforge.common.capabilities.ICapabilitySerializable;
import net.minecraftforge.common.util.LazyOptional;
public class PositionProvider implements ICapabilitySerializable<CompoundTag>
{
public static final Capability<IPosition> POSITION_CAPABILITY = CapabilityManager.get(new CapabilityToken<>(){});
private IPosition instance = new TEPosition();// POSITION_CAPABILITY.getDefaultInstance();
@SuppressWarnings("unchecked")
@Override
public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side)
{
if (cap == POSITION_CAPABILITY)
return (LazyOptional<T>) LazyOptional.of(TEPosition::new);
return LazyOptional.empty();
}
@Override
public CompoundTag serializeNBT()
{
CompoundTag tag = new CompoundTag();
tag.putBoolean("blockActivated", this.instance.isBlockActivated());
tag.putInt("x", this.instance.getPos().getX());
tag.putInt("y", this.instance.getPos().getY());
tag.putInt("z", this.instance.getPos().getZ());
return tag;
}
@Override
public void deserializeNBT(CompoundTag nbt)
{
CompoundTag tag = nbt;
int x = tag.getInt("x");
int y = tag.getInt("y");
int z = tag.getInt("z");
BlockPos pos = new BlockPos(x, y, z);
this.instance.setPos(pos);
this.instance.setBlockActivated(tag.getBoolean("blockActivated"));
}
}

View File

@ -1,35 +0,0 @@
package tschipp.carryon.common.capabilities;
import net.minecraft.core.BlockPos;
public class TEPosition implements IPosition
{
private BlockPos pos = new BlockPos(0, 0, 0);
private boolean blockActivated = false;
@Override
public BlockPos getPos()
{
return this.pos;
}
@Override
public void setPos(BlockPos pos)
{
this.pos = pos;
}
@Override
public boolean isBlockActivated()
{
return this.blockActivated;
}
@Override
public void setBlockActivated(boolean b)
{
this.blockActivated = b;
}
}

View File

@ -1,89 +0,0 @@
package tschipp.carryon.common.capabilities.event;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.client.event.ScreenEvent;
import net.minecraftforge.event.TickEvent.PlayerTickEvent;
import net.minecraftforge.event.entity.player.PlayerContainerEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.LogicalSide;
import tschipp.carryon.common.capabilities.IPosition;
import tschipp.carryon.common.capabilities.PositionProvider;
import tschipp.carryon.common.capabilities.TEPosition;
public class PositionClientEvents
{
@SuppressWarnings("resource")
@OnlyIn(Dist.CLIENT)
@SubscribeEvent
public void onGui(ScreenEvent.BackgroundRendered event)
{
if (event.getScreen() != null)
{
Player player = Minecraft.getInstance().player;
boolean inventory = event.getScreen() instanceof AbstractContainerScreen;
if (player != null && inventory && player.getCapability(PositionProvider.POSITION_CAPABILITY).isPresent())
{
IPosition cap = player.getCapability(PositionProvider.POSITION_CAPABILITY).orElse(new TEPosition());
if (cap.isBlockActivated())
{
Level level = player.level;
BlockPos pos = cap.getPos();
if (level != null)
{
BlockEntity te = level.getBlockEntity(pos);
if (te == null)
{
// player.openContainer = null;
Minecraft.getInstance().screen = null;
// Minecraft.getInstance().fo;
cap.setBlockActivated(false);
cap.setPos(new BlockPos(0, 0, 0));
}
}
}
}
}
}
@OnlyIn(Dist.CLIENT)
@SubscribeEvent
public void onGuiClose(PlayerContainerEvent.Close event)
{
Player player = event.getEntity();
if (player.getCapability(PositionProvider.POSITION_CAPABILITY).isPresent())
{
IPosition cap = player.getCapability(PositionProvider.POSITION_CAPABILITY).orElse(new TEPosition());
cap.setBlockActivated(false);
cap.setPos(new BlockPos(0, 0, 0));
}
}
@OnlyIn(Dist.CLIENT)
@SubscribeEvent
public void onPlayerTick(PlayerTickEvent event)
{
if (event.side == LogicalSide.CLIENT)
{
Player player = event.player;
if (player.getCapability(PositionProvider.POSITION_CAPABILITY).isPresent())
{
IPosition cap = player.getCapability(PositionProvider.POSITION_CAPABILITY).orElse(new TEPosition());
if (cap.isBlockActivated() && Minecraft.getInstance().screen == null)
{
cap.setBlockActivated(false);
cap.setPos(new BlockPos(0, 0, 0));
}
}
}
}
}

View File

@ -1,50 +0,0 @@
package tschipp.carryon.common.capabilities.event;
import net.minecraft.core.BlockPos;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraftforge.common.util.FakePlayer;
import net.minecraftforge.event.AttachCapabilitiesEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import tschipp.carryon.CarryOn;
import tschipp.carryon.common.capabilities.IPosition;
import tschipp.carryon.common.capabilities.PositionProvider;
import tschipp.carryon.common.capabilities.TEPosition;
public class PositionCommonEvents
{
@SubscribeEvent
public void onAttachCaps(AttachCapabilitiesEvent<Entity> event)
{
if (event.getObject() instanceof Player)
{
event.addCapability(new ResourceLocation(CarryOn.MODID, "position"), new PositionProvider());
}
}
@SubscribeEvent
public void onBlockRight(PlayerInteractEvent.RightClickBlock event)
{
BlockPos pos = event.getPos();
Level level = event.getLevel();
Player player = event.getEntity();
if (event.isCanceled() || player == null || player instanceof FakePlayer)
return;
BlockEntity te = level.getBlockEntity(pos);
if (te != null && player.getCapability(PositionProvider.POSITION_CAPABILITY).isPresent())
{
IPosition cap = player.getCapability(PositionProvider.POSITION_CAPABILITY).orElse(new TEPosition());
cap.setBlockActivated(true);
cap.setPos(pos);
}
}
}

View File

@ -1,122 +0,0 @@
package tschipp.carryon.common.command;
import java.util.Collection;
import java.util.Collections;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
import net.minecraft.commands.arguments.EntityArgument;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.network.PacketDistributor;
import tschipp.carryon.CarryOn;
import tschipp.carryon.common.handler.CustomPickupOverrideHandler;
import tschipp.carryon.common.handler.ModelOverridesHandler;
import tschipp.carryon.common.handler.RegistrationHandler;
import tschipp.carryon.common.item.ItemCarryonBlock;
import tschipp.carryon.common.item.ItemCarryonEntity;
import tschipp.carryon.network.client.CarrySlotPacket;
public class CommandCarryOn
{
public static void register(CommandDispatcher<CommandSourceStack> dispatcher)
{
LiteralArgumentBuilder<CommandSourceStack> builder = Commands.literal("carryon")
.then(Commands.literal("debug").executes(cmd -> handleDebug(cmd.getSource())))
.then(Commands.literal("clear").executes(cmd -> handleClear(cmd.getSource(), Collections.singleton(cmd.getSource().getPlayerOrException()))))
.then(Commands.literal("clear").then(Commands.argument("target", EntityArgument.players()).requires(src -> src.hasPermission(2)).executes(cmd -> handleClear(cmd.getSource(), EntityArgument.getPlayers(cmd, "target")))))
;
dispatcher.register(builder);
}
private static int handleDebug(CommandSourceStack source)
{
try
{
if (source.getEntityOrException() != null)
{
ServerPlayer player = source.getPlayerOrException();
ItemStack main = player.getMainHandItem();
if (!main.isEmpty() && main.getItem() == RegistrationHandler.itemTile.get())
{
source.sendSuccess(Component.literal("Block: " + ItemCarryonBlock.getBlock(main)), true);
source.sendSuccess(Component.literal("BlockState: " + ItemCarryonBlock.getBlockState(main)), true);
source.sendSuccess(Component.literal("ItemStack: " + ItemCarryonBlock.getItemStack(main)), true);
if (ModelOverridesHandler.hasCustomOverrideModel(ItemCarryonBlock.getBlockState(main), ItemCarryonBlock.getTileData(main)))
source.sendSuccess(Component.literal("Override Model: " + ModelOverridesHandler.getOverrideObject(ItemCarryonBlock.getBlockState(main), ItemCarryonBlock.getTileData(main))), true);
if (CustomPickupOverrideHandler.hasSpecialPickupConditions(ItemCarryonBlock.getBlockState(main)))
source.sendSuccess(Component.literal("Custom Pickup Condition: " + CustomPickupOverrideHandler.getPickupCondition(ItemCarryonBlock.getBlockState(main))), true);
CarryOn.LOGGER.info("Block: " + ItemCarryonBlock.getBlock(main));
CarryOn.LOGGER.info("BlockState: " + ItemCarryonBlock.getBlockState(main));
CarryOn.LOGGER.info("ItemStack: " + ItemCarryonBlock.getItemStack(main));
if (ModelOverridesHandler.hasCustomOverrideModel(ItemCarryonBlock.getBlockState(main), ItemCarryonBlock.getTileData(main)))
CarryOn.LOGGER.info("Override Model: " + ModelOverridesHandler.getOverrideObject(ItemCarryonBlock.getBlockState(main), ItemCarryonBlock.getTileData(main)));
if (CustomPickupOverrideHandler.hasSpecialPickupConditions(ItemCarryonBlock.getBlockState(main)))
CarryOn.LOGGER.info("Custom Pickup Condition: " + CustomPickupOverrideHandler.getPickupCondition(ItemCarryonBlock.getBlockState(main)));
return 1;
}
else if (!main.isEmpty() && main.getItem() == RegistrationHandler.itemEntity.get())
{
source.sendSuccess(Component.literal("Entity: " + ItemCarryonEntity.getEntity(main, player.level)), true);
source.sendSuccess(Component.literal("Entity Name: " + ItemCarryonEntity.getEntityName(main)), true);
if (CustomPickupOverrideHandler.hasSpecialPickupConditions(ItemCarryonEntity.getEntity(main, player.level)))
source.sendSuccess(Component.literal("Custom Pickup Condition: " + CustomPickupOverrideHandler.getPickupCondition(ItemCarryonEntity.getEntity(main, player.level))), true);
CarryOn.LOGGER.info("Entity: " + ItemCarryonEntity.getEntity(main, player.level));
CarryOn.LOGGER.info("Entity Name: " + ItemCarryonEntity.getEntityName(main));
if (CustomPickupOverrideHandler.hasSpecialPickupConditions(ItemCarryonEntity.getEntity(main, player.level)))
CarryOn.LOGGER.info("Custom Pickup Condition: " + CustomPickupOverrideHandler.getPickupCondition(ItemCarryonEntity.getEntity(main, player.level)));
return 1;
}
}
}
catch (CommandSyntaxException e)
{
}
return 0;
}
private static int handleClear(CommandSourceStack source, Collection<ServerPlayer> players)
{
for (ServerPlayer player : players)
{
int cleared = 0;
cleared += player.getInventory().clearOrCountMatchingItems(stack -> !stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile.get(), 64, player.inventoryMenu.getCraftSlots()); // TODO
cleared += player.getInventory().clearOrCountMatchingItems(stack -> !stack.isEmpty() && stack.getItem() == RegistrationHandler.itemEntity.get(), 64, player.inventoryMenu.getCraftSlots());
CarryOn.network.send(PacketDistributor.PLAYER.with(() -> player), new CarrySlotPacket(9, player.getId()));
if (cleared != 1)
source.sendSuccess(Component.literal("Cleared " + cleared + " Items!"), true);
else
source.sendSuccess(Component.literal("Cleared " + cleared + " Item!"), true);
return 1;
}
return 0;
}
}

View File

@ -1,16 +0,0 @@
package tschipp.carryon.common.config;
public class CarryOnConfig
{
public static Configs.Settings settings = new Configs.Settings();
public static Configs.Blacklist blacklist = new Configs.Blacklist();
public static Configs.WhiteList whitelist = new Configs.WhiteList();
public static Configs.ModelOverrides modelOverrides = new Configs.ModelOverrides();
public static Configs.CustomPickupConditions customPickupConditions = new Configs.CustomPickupConditions();
}

View File

@ -1,329 +0,0 @@
package tschipp.carryon.common.config;
import java.util.Arrays;
import java.util.List;
import com.electronwill.nightconfig.core.CommentedConfig;
import com.electronwill.nightconfig.core.file.CommentedFileConfig;
import net.minecraftforge.common.ForgeConfigSpec;
import net.minecraftforge.common.ForgeConfigSpec.BooleanValue;
import net.minecraftforge.common.ForgeConfigSpec.ConfigValue;
import net.minecraftforge.common.ForgeConfigSpec.DoubleValue;
import net.minecraftforge.common.ForgeConfigSpec.IntValue;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus;
import net.minecraftforge.fml.event.config.ModConfigEvent;
import tschipp.carryon.CarryOn;
import tschipp.carryon.common.handler.ListHandler;
@Mod.EventBusSubscriber(modid = CarryOn.MODID, bus = Bus.MOD)
public class Configs {
private static final ForgeConfigSpec.Builder SERVER_BUILDER = new ForgeConfigSpec.Builder();
private static final ForgeConfigSpec.Builder CLIENT_BUILDER = new ForgeConfigSpec.Builder();
public static final ForgeConfigSpec SERVER_CONFIG;
public static final ForgeConfigSpec CLIENT_CONFIG;
public static boolean SERVER_LOADED = false;
static {
Settings.init(SERVER_BUILDER, CLIENT_BUILDER);
Blacklist.init(SERVER_BUILDER, CLIENT_BUILDER);
WhiteList.init(SERVER_BUILDER, CLIENT_BUILDER);
ModelOverrides.init(SERVER_BUILDER, CLIENT_BUILDER);
CustomPickupConditions.init(SERVER_BUILDER, CLIENT_BUILDER);
SERVER_CONFIG = SERVER_BUILDER.build();
CLIENT_CONFIG = CLIENT_BUILDER.build();
}
@SubscribeEvent
public static void onLoad(final ModConfigEvent event) {
if (event.getConfig().getModId().equals(CarryOn.MODID) && event.getConfig().getSpec() == SERVER_CONFIG) {
SERVER_LOADED = true;
CommentedConfig cfg = event.getConfig().getConfigData();
if (cfg instanceof CommentedFileConfig cfig) {
cfig.load();
ListHandler.initConfigLists();
}
}
}
// @SubscribeEvent
// public static void onConfigChanged(ModConfigEvent.Reloading event) {
// if (event.getConfig().getModId().equals(CarryOn.MODID) && event.getConfig().getSpec() == SERVER_CONFIG) {
//
// CommentedConfig cfg = event.getConfig().getConfigData();
//
// if (cfg instanceof CommentedFileConfig)
// {
// ((CommentedFileConfig) cfg).load();
// ListHandler.initConfigLists();
// }
// }
// }
public static class Settings {
public static BooleanValue facePlayer;
public static BooleanValue heavyTiles;
public static BooleanValue pickupAllBlocks;
public static BooleanValue slownessInCreative;
public static DoubleValue maxDistance;
public static DoubleValue maxEntityWidth;
public static DoubleValue maxEntityHeight;
public static BooleanValue pickupHostileMobs;
public static BooleanValue heavyEntities;
public static DoubleValue blockSlownessMultiplier;
public static DoubleValue entitySlownessMultiplier;
public static BooleanValue renderArms;
public static BooleanValue allowBabies;
public static BooleanValue useWhitelistBlocks;
public static BooleanValue useWhitelistEntities;
public static BooleanValue useWhitelistStacking;
public static BooleanValue hitWhileCarrying;
public static BooleanValue dropCarriedWhenHit;
public static BooleanValue useScripts;
public static BooleanValue stackableEntities;
public static IntValue maxEntityStackLimit;
public static BooleanValue entitySizeMattersStacking;
public static void init(ForgeConfigSpec.Builder s, ForgeConfigSpec.Builder c) {
c.comment("Settings");
s.comment("Settings");
s.push("settings");
c.push("settings");
maxDistance = s.comment("Maximum distance from where Blocks and Entities can be picked up")
.defineInRange("maxDistance", 2.5, 0, Double.MAX_VALUE);
maxEntityWidth = s.comment("Max width of entities that can be picked up in survival mode")
.defineInRange("maxEntityWidth", 1.5, 0, 10);
maxEntityHeight = s.comment("Max height of entities that can be picked up in survival mode")
.defineInRange("maxEntityHeight", 2.0, 0, 10);
blockSlownessMultiplier = s.comment("Slowness multiplier for blocks")
.defineInRange("blockSlownessMultiplier", 1, 0, Double.MAX_VALUE);
entitySlownessMultiplier = s.comment("Slowness multiplier for entities")
.defineInRange("entitySlownessMultiplier", 1, 0, Double.MAX_VALUE);
maxEntityStackLimit = s.comment("Maximum stack limit for entities").defineInRange("maxEntityStackLimit", 10,
1, Integer.MAX_VALUE);
facePlayer = c.comment("If the front of the Tile Entities should face the player or should face outward")
.define("facePlayer", false);
heavyTiles = s.comment("More complex Tile Entities slow down the player more").define("heavyTiles", true);
pickupAllBlocks = s.comment("Allow all blocks to be picked up, not just Tile Entites")
.define("pickupAllBlocks", false);
slownessInCreative = s.comment("Whether Blocks and Entities slow the creative player down when carried")
.define("slownessInCreative", true);
pickupHostileMobs = s.comment("Whether hostile mobs should be able to picked up in survival mode")
.define("pickupHostileMobs", false);
heavyEntities = s.comment("Larger Entities slow down the player more").define("heavyEntities", true);
renderArms = c.comment("Arms should render on sides when carrying").define("renderArms", true);
allowBabies = s
.comment("Allow babies to be carried even when adult mob is blacklisted (or not whitelisted)")
.define("allowBabies", false);
useWhitelistBlocks = s.comment("Use Whitelist instead of Blacklist for Blocks").define("useWhitelistBlocks",
false);
useWhitelistEntities = s.comment("Use Whitelist instead of Blacklist for Entities")
.define("useWhitelistEntities", false);
useWhitelistStacking = s.comment("Use Whitelist instead of Blacklist for Stacking")
.define("useWhitelistStacking", false);
hitWhileCarrying = s.comment("Whether the player can hit blocks and entities while carrying or not")
.define("hitWhileCarrying", false);
dropCarriedWhenHit = s.comment("Whether the player drops the carried object when hit or not")
.define("dropCarriedWhenHit", false);
useScripts = s.comment(
"Use custom Pickup Scripts. Having this set to false, will not allow you to run scripts, but will increase your performance")
.worldRestart().define("useScripts", false);
stackableEntities = s.comment("Allows entities to be stacked using Carry On").define("stackableEntities",
true);
entitySizeMattersStacking = s.comment("Whether entities' size matters when stacking or not")
.define("stackableEntities", true);
s.pop();
c.pop();
}
}
public static class WhiteList {
public static ConfigValue<List<? extends String>> allowedEntities;
public static ConfigValue<List<? extends String>> allowedBlocks;
public static ConfigValue<List<? extends String>> allowedStacking;
public static void init(ForgeConfigSpec.Builder s, ForgeConfigSpec.Builder c) {
s.comment(
"Whitelist. Read about the format here: https://github.com/Tschipp/CarryOn/wiki/Black---and-Whitelist-Config");
allowedEntities = s.comment("Entities that CAN be picked up (useWhitelistEntities must be true)")
.defineList("whitelist.allowedEntities", Arrays.asList(),
obj -> obj instanceof String ? true : false);
allowedBlocks = s.comment("Blocks that CAN be picked up (useWhitelistBlocks must be true)").defineList(
"whitelist.allowedBlocks", Arrays.asList(), obj -> obj instanceof String ? true : false);
allowedStacking = s.comment(
"Entities that CAN have other entities stacked on top of them (useWhitelistStacking must be true)")
.defineList("whitelist.allowedStacking", Arrays.asList(),
obj -> obj instanceof String ? true : false);
}
}
public static class Blacklist {
public static ConfigValue<List<? extends String>> forbiddenTiles;
public static ConfigValue<List<? extends String>> forbiddenEntities;
public static ConfigValue<List<? extends String>> forbiddenStacking;
public static void init(ForgeConfigSpec.Builder s, ForgeConfigSpec.Builder c) {
s.comment(
"Blacklist. Read about the format here: https://github.com/Tschipp/CarryOn/wiki/Black---and-Whitelist-Config");
forbiddenTiles = s.comment("Blocks that cannot be picked up").defineList("blacklist.forbiddenTiles",
Arrays.asList("#forge:immovable", "#forge:relocation_not_supported", "minecraft:end_portal",
"minecraft:end_gateway", "minecraft:tall_grass", "minecraft:large_fern", "minecraft:peony",
"minecraft:rose_bush", "minecraft:lilac", "minecraft:sunflower", "minecraft:*_bed",
"minecraft:oak_door", "minecraft:iron_door", "minecraft:spruce_door",
"minecraft:birch_door", "minecraft:jungle_door", "minecraft:acacia_door",
"minecraft:dark_oak_door", "minecraft:waterlily", "minecraft:cake",
"minecraft:nether_portal", "minecraft:tall_seagrass", "animania:block_trough",
"animania:block_invisiblock", "colossalchests:*", "ic2:*", "bigreactors:*", "forestry:*",
"tconstruct:*", "rustic:*", "botania:*", "astralsorcery:*", "quark:colored_bed_*",
"immersiveengineering:*", "embers:block_furnace", "embers:ember_bore",
"embers:ember_activator", "embers:mixer", "embers:heat_coil", "embers:large_tank",
"embers:crystal_cell", "embers:alchemy_pedestal", "embers:boiler", "embers:combustor",
"embers:catalzyer", "embers:field_chart", "embers:inferno_forge",
"storagedrawers:framingtable", "skyresources:*", "lootbags:*", "exsartagine:*",
"aquamunda:tank", "opencomputers:*", "malisisdoors:*", "industrialforegoing:*",
"minecolonies:*", "thaumcraft:pillar*", "thaumcraft:infernal_furnace",
"thaumcraft:placeholder*", "thaumcraft:infusion_matrix", "thaumcraft:golem_builder",
"thaumcraft:thaumatorium*", "magneticraft:oil_heater", "magneticraft:solar_panel",
"magneticraft:steam_engine", "magneticraft:shelving_unit", "magneticraft:grinder",
"magneticraft:sieve", "magneticraft:solar_tower", "magneticraft:solar_mirror",
"magneticraft:container", "magneticraft:pumpjack", "magneticraft:solar_panel",
"magneticraft:refinery", "magneticraft:oil_heater", "magneticraft:hydraulic_press",
"magneticraft:multiblock_gap", "refinedstorage:*", "mcmultipart:*", "enderstorage:*",
"betterstorage:*", "practicallogistics2:*", "wearablebackpacks:*", "rftools:screen",
"rftools:creative_screen", "create:*", "magic_doorknob:*", "iceandfire:*", "ftbquests:*",
"waystones:*"),
obj -> obj instanceof String);
forbiddenEntities = s.comment("Entities that cannot be picked up").defineList("blacklist.forbiddenEntities",
Arrays.asList("minecraft:end_crystal", "minecraft:ender_dragon", "minecraft:ghast",
"minecraft:shulker", "minecraft:leash_knot", "minecraft:armor_stand",
"minecraft:item_frame", "minecraft:painting", "minecraft:shulker_bullet",
"animania:hamster", "animania:ferret*", "animania:hedgehog*", "animania:cart",
"animania:wagon", "mynko:*", "pixelmon:*", "mocreatures:*", "quark:totem", "vehicle:*"),
obj -> obj instanceof String ? true : false);
forbiddenStacking = s.comment("Entities that cannot have other entities stacked on top of them").defineList(
"blacklist.forbiddenStacking", Arrays.asList("minecraft:horse"),
obj -> obj instanceof String ? true : false);
}
}
public static class ModelOverrides {
public static ConfigValue<List<? extends String>> modelOverrides;
public static void init(ForgeConfigSpec.Builder s, ForgeConfigSpec.Builder c) {
c.comment(
"Model Overrides. Read about the format here: https://github.com/Tschipp/CarryOn/wiki/Model-Override-Config");
modelOverrides = c.comment("Model Overrides based on NBT or on Meta. Advanced Users Only!").defineList(
"modeloverrides.overrides",
Arrays.asList("minecraft:hopper->(block)minecraft:hopper",
"minecraft:comparator->(block)minecraft:comparator",
"minecraft:repeater->(block)minecraft:repeater",
"minecraft:cauldron->(block)minecraft:cauldron",
"minecraft:brewing_stand->(item)minecraft:brewing_stand",
"minecraft:flower_pot->(block)minecraft:flower_pot",
"minecraft:sugar_cane->(block)minecraft:sugar_cane",
"minecraft:redstone_wire->(item)minecraft:redstone",
"animania:block_nest->(block)animania:block_nest",
"animania:cheese_mold;0->(block)animania:cheese_mold;0",
"animania:cheese_mold;1->(block)animania:cheese_mold;1",
"animania:cheese_mold;2->(block)animania:cheese_mold;2",
"animania:cheese_mold;3->(block)animania:cheese_mold;3",
"animania:cheese_mold;4->(block)animania:cheese_mold;4",
"animania:cheese_mold;5->(block)animania:cheese_mold;5",
"animania:cheese_mold;6->(block)animania:cheese_mold;6",
"animania:cheese_mold;7->(block)animania:cheese_mold;7",
"animania:cheese_mold;8->(block)animania:cheese_mold;8",
"animania:cheese_mold;9->(block)animania:cheese_mold;9",
"animania:cheese_mold;10->(block)animania:cheese_mold;10"),
obj -> obj instanceof String ? true : false);
}
}
public static class CustomPickupConditions {
public static ConfigValue<List<? extends String>> customPickupConditionsBlocks;
public static ConfigValue<List<? extends String>> customPickupConditionsEntities;
public static void init(ForgeConfigSpec.Builder s, ForgeConfigSpec.Builder c) {
s.comment(
"Custom Pickup Conditions. Read about the format here: https://github.com/Tschipp/CarryOn/wiki/Custom-Pickup-Condition-Config");
customPickupConditionsBlocks = s.comment("Custom Pickup Conditions for Blocks").defineList(
"custom_pickup_conditions.customPickupConditionsBlocks", Arrays.asList(),
obj -> obj instanceof String ? true : false);
customPickupConditionsEntities = s.comment("Custom Pickup Conditions for Entities").defineList(
"custom_pickup_conditions.customPickupConditionsEntities", Arrays.asList(),
obj -> obj instanceof String ? true : false);
}
}
}

View File

@ -1,59 +0,0 @@
package tschipp.carryon.common.event;
import java.util.stream.Stream;
import net.minecraftforge.eventbus.api.EventPriority;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.InterModComms;
import net.minecraftforge.fml.InterModComms.IMCMessage;
import net.minecraftforge.fml.event.lifecycle.FMLDedicatedServerSetupEvent;
import tschipp.carryon.CarryOn;
import tschipp.carryon.common.handler.ListHandler;
import tschipp.carryon.common.handler.ModelOverridesHandler;
public class IMCEvents
{
@SubscribeEvent(priority = EventPriority.LOW)
public void serverLoad(FMLDedicatedServerSetupEvent event)
{
Stream<IMCMessage> messages = InterModComms.getMessages(CarryOn.MODID);
messages.forEach(msg -> {
String method = msg.method();
Object obj = msg.messageSupplier().get();
if (!(obj instanceof String str))
return;
switch (method)
{
case "blacklistBlock":
ListHandler.FORBIDDEN_TILES.add(str);
break;
case "blacklistEntity":
ListHandler.FORBIDDEN_ENTITIES.add(str);
break;
case "whitelistBlock":
ListHandler.ALLOWED_TILES.add(str);
break;
case "whitelistEntity":
ListHandler.ALLOWED_ENTITIES.add(str);
break;
case "blacklistStacking":
ListHandler.FORBIDDEN_STACKING.add(str);
break;
case "whitelistStacking":
ListHandler.ALLOWED_STACKING.add(str);
break;
case "addModelOverride":
ModelOverridesHandler.parseOverride(str, 0);
break;
}
});
}
}

View File

@ -1,270 +0,0 @@
package tschipp.carryon.common.event;
import java.util.List;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.animal.Animal;
import net.minecraft.world.entity.animal.horse.Horse;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.material.Material;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.event.entity.EntityJoinLevelEvent;
import net.minecraftforge.event.entity.living.LivingEvent.LivingTickEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.eventbus.api.Event.Result;
import net.minecraftforge.eventbus.api.EventPriority;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
import tschipp.carryon.client.keybinds.CarryOnKeybinds;
import tschipp.carryon.common.config.Configs.Settings;
import tschipp.carryon.common.handler.ListHandler;
import tschipp.carryon.common.handler.PickupHandler;
import tschipp.carryon.common.handler.RegistrationHandler;
import tschipp.carryon.common.item.ItemCarryonEntity;
import tschipp.carryon.common.scripting.CarryOnOverride;
import tschipp.carryon.common.scripting.ScriptChecker;
public class ItemEntityEvents
{
@SubscribeEvent(priority = EventPriority.HIGH)
public void onBlockClick(PlayerInteractEvent.RightClickBlock event)
{
Player player = event.getEntity();
ItemStack stack = player.getMainHandItem();
if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemEntity.get() && ItemCarryonEntity.hasEntityData(stack))
{
player.getPersistentData().remove("carrySlot");
event.setUseBlock(Result.DENY);
if (!player.level.isClientSide)
{
CarryOnOverride override = ScriptChecker.getOverride(player);
if (override != null)
{
String command = override.getCommandPlace();
if (command != null)
player.getServer().getCommands().performCommand(player.getServer().createCommandSourceStack(), "/execute as " + player.getGameProfile().getName() + " run " + command);
}
}
}
}
@SubscribeEvent(priority = EventPriority.HIGH)
public void onItemDropped(EntityJoinLevelEvent event)
{
Entity e = event.getEntity();
Level level = event.getLevel();
if (e instanceof net.minecraft.world.entity.item.ItemEntity eitem)
{
ItemStack stack = eitem.getItem();
Item item = stack.getItem();
if (item == RegistrationHandler.itemEntity.get() && ItemCarryonEntity.hasEntityData(stack))
{
BlockPos pos = eitem.blockPosition();
Entity entity = ItemCarryonEntity.getEntity(stack, level);
entity.setPos(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5);
level.addFreshEntity(entity);
ItemCarryonEntity.clearEntityData(stack);
eitem.setItem(ItemStack.EMPTY);
}
}
}
@SubscribeEvent(priority = EventPriority.HIGH)
public void onEntityRightClick(PlayerInteractEvent.EntityInteract event)
{
Player player = event.getEntity();
if (player instanceof ServerPlayer)
{
ItemStack main = player.getMainHandItem();
ItemStack off = player.getOffhandItem();
Level level = event.getLevel();
Entity entity = event.getTarget();
BlockPos pos = entity.blockPosition();
if (main.isEmpty() && off.isEmpty() && CarryOnKeybinds.isKeyPressed(player))
{
ItemStack stack = new ItemStack(RegistrationHandler.itemEntity.get());
if (entity.invulnerableTime == 0)
{
if (entity instanceof Animal)
((Animal) entity).dropLeash(true, true);
if (PickupHandler.canPlayerPickUpEntity((ServerPlayer) player, entity) && ItemCarryonEntity.storeEntityData(entity, level, stack))
{
LazyOptional<IItemHandler> handler = entity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY);
handler.ifPresent(hand -> {
for (int i = 0; i < hand.getSlots(); i++)
{
hand.extractItem(i, 64, false);
}
});
CarryOnOverride override = ScriptChecker.inspectEntity(entity);
int overrideHash = 0;
if (override != null)
overrideHash = override.hashCode();
ItemEvents.sendPacket(player, player.getInventory().selected, overrideHash);
if (entity instanceof LivingEntity)
((LivingEntity) entity).setHealth(0);
entity.ejectPassengers();
entity.setPos(entity.getX(), 0, entity.getZ());
entity.discard();
player.setItemInHand(InteractionHand.MAIN_HAND, stack);
event.setCanceled(true);
event.setCancellationResult(InteractionResult.FAIL);
}
}
}
else if (!main.isEmpty() && main.getItem() == RegistrationHandler.itemEntity.get() && ItemCarryonEntity.hasEntityData(main) && !CarryOnKeybinds.isKeyPressed(player) && Settings.stackableEntities.get())
{
Entity entityHeld = ItemCarryonEntity.getEntity(main, level);
if (entity.invulnerableTime == 0 && entityHeld instanceof LivingEntity)
{
if (!level.isClientSide && entityHeld.getUUID() != entity.getUUID() && entity.isAlive())
{
double sizeHeldEntity = entityHeld.getBbHeight() * entityHeld.getBbWidth();
double distance = pos.distSqr(player.blockPosition());
Entity lowestEntity = entity.getRootVehicle();
int numPassengers = getAllPassengers(lowestEntity);
if (numPassengers < Settings.maxEntityStackLimit.get() - 1)
{
Entity topEntity = getTopPassenger(lowestEntity);
if (Settings.useWhitelistStacking.get() ? ListHandler.isStackingAllowed(topEntity) : !ListHandler.isStackingForbidden(topEntity))
{
double sizeEntity = topEntity.getBbHeight() * topEntity.getBbWidth();
if (Settings.entitySizeMattersStacking.get() && sizeHeldEntity <= sizeEntity || !Settings.entitySizeMattersStacking.get())
{
if (topEntity instanceof Horse horse)
{
horse.setTamed(true);
}
if (distance < 6)
{
double tempX = entity.getX();
double tempY = entity.getY();
double tempZ = entity.getZ();
entityHeld.setPos(tempX, tempY + 2.6, tempZ);
level.addFreshEntity(entityHeld);
entityHeld.startRiding(topEntity, false);
entityHeld.teleportTo(tempX, tempY, tempZ);
}
else
{
entityHeld.setPos(entity.getX(), entity.getY(), entity.getZ());
level.addFreshEntity(entityHeld);
entityHeld.startRiding(topEntity, false);
}
ItemCarryonEntity.clearEntityData(main);
player.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY);
ItemEvents.sendPacket(player, 9, 0);
event.setCanceled(true);
event.setCancellationResult(InteractionResult.FAIL);
level.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.HORSE_SADDLE, SoundSource.PLAYERS, 0.5F, 1.5F);
}
else
{
level.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.NOTE_BLOCK_BASS, SoundSource.PLAYERS, 0.5F, 1.5F);
}
}
}
else
{
level.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.NOTE_BLOCK_BASS, SoundSource.PLAYERS, 0.5F, 1.5F);
}
}
}
}
}
}
public static int getAllPassengers(Entity entity)
{
int passengers = 0;
while (entity.isVehicle())
{
List<Entity> pass = entity.getPassengers();
if (!pass.isEmpty())
{
entity = pass.get(0);
passengers++;
}
}
return passengers;
}
public static Entity getTopPassenger(Entity entity)
{
Entity top = entity;
while (entity.isVehicle())
{
List<Entity> pass = entity.getPassengers();
if (!pass.isEmpty())
{
entity = pass.get(0);
top = entity;
}
}
return top;
}
@SubscribeEvent
public void onLivingUpdate(LivingTickEvent event)
{
LivingEntity entity = event.getEntity();
Level level = entity.level;
ItemStack main = entity.getMainHandItem();
if (!main.isEmpty() && main.getItem() == RegistrationHandler.itemEntity.get() && ItemCarryonEntity.hasEntityData(main))
{
BlockPos pos = entity.blockPosition();
BlockPos below = pos.relative(Direction.DOWN);
if (level.getBlockState(pos).getMaterial() == Material.WATER || level.getBlockState(below).getMaterial() == Material.WATER)
{
Entity contained = ItemCarryonEntity.getEntity(main, level);
if (contained != null)
{
float height = contained.getBbWidth();
float width = contained.getBbWidth();
entity.push(0, -0.01 * height * width, 0);
}
}
}
}
}

View File

@ -1,547 +0,0 @@
package tschipp.carryon.common.event;
import java.util.Optional;
import net.minecraft.ChatFormatting;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.ClickEvent;
import net.minecraft.network.chat.ClickEvent.Action;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.Container;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.item.context.DirectionalPlaceContext;
import net.minecraft.world.level.GameRules;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.event.RegisterCommandsEvent;
import net.minecraftforge.event.TagsUpdatedEvent;
import net.minecraftforge.event.entity.EntityJoinLevelEvent;
import net.minecraftforge.event.entity.living.LivingAttackEvent;
import net.minecraftforge.event.entity.living.LivingEvent.LivingTickEvent;
import net.minecraftforge.event.entity.player.AttackEntityEvent;
import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.event.entity.player.PlayerEvent.BreakSpeed;
import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent;
import net.minecraftforge.event.entity.player.PlayerEvent.StartTracking;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.event.level.BlockEvent.BreakEvent;
import net.minecraftforge.event.level.LevelEvent;
import net.minecraftforge.eventbus.api.Event.Result;
import net.minecraftforge.eventbus.api.EventPriority;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import net.minecraftforge.fml.event.lifecycle.FMLDedicatedServerSetupEvent;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.network.PacketDistributor;
import net.minecraftforge.network.PacketDistributor.TargetPoint;
import tschipp.carryon.CarryOn;
import tschipp.carryon.client.keybinds.CarryOnKeybinds;
import tschipp.carryon.common.command.CommandCarryOn;
import tschipp.carryon.common.config.Configs;
import tschipp.carryon.common.config.Configs.Settings;
import tschipp.carryon.common.handler.CustomPickupOverrideHandler;
import tschipp.carryon.common.handler.ListHandler;
import tschipp.carryon.common.handler.PickupHandler;
import tschipp.carryon.common.handler.RegistrationHandler;
import tschipp.carryon.common.item.ItemCarryonBlock;
import tschipp.carryon.common.item.ItemCarryonEntity;
import tschipp.carryon.common.scripting.CarryOnOverride;
import tschipp.carryon.common.scripting.ScriptChecker;
import tschipp.carryon.common.scripting.ScriptReader;
import tschipp.carryon.network.client.CarrySlotPacket;
import tschipp.carryon.network.client.ScriptReloadPacket;
@EventBusSubscriber(modid = CarryOn.MODID)
public class ItemEvents
{
@SubscribeEvent(priority = EventPriority.HIGH)
public void onBlockClick(PlayerInteractEvent.RightClickBlock event)
{
if (event.isCanceled())
return;
Player player = event.getEntity();
ItemStack stack = player.getMainHandItem();
if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile.get() && ItemCarryonBlock.hasTileData(stack))
{
player.getPersistentData().remove("carrySlot");
event.setUseBlock(Result.DENY);
if (!player.level.isClientSide)
{
CarryOnOverride override = ScriptChecker.getOverride(player);
if (override != null)
{
String command = override.getCommandPlace();
if (command != null && !command.isEmpty())
player.getServer().getCommands().performCommand(player.getServer().createCommandSourceStack(), "/execute as " + player.getGameProfile().getName() + " run " + command);
}
}
}
}
@SubscribeEvent(priority = EventPriority.HIGH)
public void onItemDropped(EntityJoinLevelEvent event)
{
Entity e = event.getEntity();
Level level = event.getLevel();
if (e instanceof net.minecraft.world.entity.item.ItemEntity eitem)
{
ItemStack stack = eitem.getItem();
Item item = stack.getItem();
if (item == RegistrationHandler.itemTile.get() && ItemCarryonBlock.hasTileData(stack))
{
BlockPos pos = eitem.blockPosition();
BlockPos finalPos = pos;
BlockPlaceContext context = new DirectionalPlaceContext(level, pos, Direction.DOWN, stack, Direction.UP);
if (!level.getBlockState(pos).canBeReplaced(context) || !context.canPlace())
{
for (Direction facing : Direction.values())
{
BlockPos offsetPos = pos.relative(facing);
BlockPlaceContext newContext = new DirectionalPlaceContext(level, offsetPos, Direction.DOWN, stack, Direction.UP);
if (level.getBlockState(offsetPos).canBeReplaced(newContext) && newContext.canPlace())
{
finalPos = offsetPos;
break;
}
}
}
level.setBlockAndUpdate(finalPos, ItemCarryonBlock.getBlockState(stack));
BlockEntity tile = level.getBlockEntity(finalPos);
if (tile != null)
{
var nbt = ItemCarryonBlock.getTileData(stack);
ItemCarryonBlock.updateTileLocation(nbt, finalPos);
tile.load(nbt);
}
ItemCarryonBlock.clearTileData(stack);
eitem.setItem(ItemStack.EMPTY);
}
// BlockPos pos = new BlockPos(Math.floor(eitem.getPosX()),
// Math.floor(eitem.getPosY()), Math.floor(eitem.getPosZ()));
// if (positions.containsKey(pos))
// {
// event.setCanceled(true);
// }
}
}
@SubscribeEvent
public void onPlayerLogin(PlayerLoggedInEvent event)
{
if (event.getEntity() instanceof Player)
{
Player player = event.getEntity();
Level level = player.getCommandSenderWorld();
ItemStack carried = player.getMainHandItem();
if (!carried.isEmpty() && carried.getItem() == RegistrationHandler.itemTile.get() || carried.getItem() == RegistrationHandler.itemEntity.get())
{
if (carried.getItem() == RegistrationHandler.itemTile.get())
{
CarryOnOverride override = ScriptChecker.inspectBlock(ItemCarryonBlock.getBlockState(carried), level, player.blockPosition(), ItemCarryonBlock.getTileData(carried));
if (override != null)
CarryOn.network.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new CarrySlotPacket(player.getInventory().selected, player.getId(), override.hashCode()));
else
CarryOn.network.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new CarrySlotPacket(player.getInventory().selected, player.getId()));
}
else
{
CarryOnOverride override = ScriptChecker.inspectEntity(ItemCarryonEntity.getEntity(carried, level));
if (override != null)
CarryOn.network.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new CarrySlotPacket(player.getInventory().selected, player.getId(), override.hashCode()));
else
CarryOn.network.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new CarrySlotPacket(player.getInventory().selected, player.getId()));
}
}
}
if (event.getEntity() instanceof ServerPlayer)
{
CarryOn.network.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) event.getEntity()), new ScriptReloadPacket(ScriptReader.OVERRIDES.values()));
}
}
@SubscribeEvent
public void serverLoad(RegisterCommandsEvent event)
{
CommandCarryOn.register(event.getDispatcher());
}
@SubscribeEvent
public void serverLoad(FMLDedicatedServerSetupEvent event)
{
CustomPickupOverrideHandler.initPickupOverrides();
}
@SubscribeEvent
public void reloadTags(TagsUpdatedEvent event)
{
ListHandler.initConfigLists();
}
@SubscribeEvent
public void unloadWorld(LevelEvent.Unload event)
{
Configs.SERVER_LOADED = false;
}
@SubscribeEvent
public void onEntityStartTracking(StartTracking event)
{
Entity e = event.getTarget();
Player tracker = event.getEntity();
if (e instanceof Player player && tracker instanceof ServerPlayer)
{
Level level = player.getCommandSenderWorld();
ItemStack carried = player.getMainHandItem();
if (!carried.isEmpty() && carried.getItem() == RegistrationHandler.itemTile.get() || carried.getItem() == RegistrationHandler.itemEntity.get())
{
if (carried.getItem() == RegistrationHandler.itemTile.get())
{
CarryOnOverride override = ScriptChecker.inspectBlock(ItemCarryonBlock.getBlockState(carried), level, player.blockPosition(), ItemCarryonBlock.getTileData(carried));
if (override != null)
CarryOn.network.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) tracker), new CarrySlotPacket(player.getInventory().selected, player.getId(), override.hashCode()));
else
CarryOn.network.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) tracker), new CarrySlotPacket(player.getInventory().selected, player.getId()));
}
else
{
CarryOnOverride override = ScriptChecker.inspectEntity(ItemCarryonEntity.getEntity(carried, level));
if (override != null)
CarryOn.network.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) tracker), new CarrySlotPacket(player.getInventory().selected, player.getId(), override.hashCode()));
else
CarryOn.network.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) tracker), new CarrySlotPacket(player.getInventory().selected, player.getId()));
}
}
}
}
@SubscribeEvent
public void harvestSpeed(BreakSpeed event)
{
Player player = event.getEntity();
if (player != null && !Settings.hitWhileCarrying.get())
{
ItemStack stack = player.getMainHandItem();
if (!stack.isEmpty() && (stack.getItem() == RegistrationHandler.itemTile.get() || stack.getItem() == RegistrationHandler.itemEntity.get()))
event.setNewSpeed(0);
}
}
@SubscribeEvent
public void attackEntity(AttackEntityEvent event)
{
Player player = event.getEntity();
ItemStack stack = player.getMainHandItem();
if (!stack.isEmpty() && !Settings.hitWhileCarrying.get() && (stack.getItem() == RegistrationHandler.itemTile.get() || stack.getItem() == RegistrationHandler.itemEntity.get()))
{
event.setCanceled(true);
}
}
@SubscribeEvent
public void harvestSpeed(BreakEvent event)
{
Player player = event.getPlayer();
if (player != null && !Settings.hitWhileCarrying.get())
{
ItemStack stack = player.getMainHandItem();
if (!stack.isEmpty() && (stack.getItem() == RegistrationHandler.itemTile.get() || stack.getItem() == RegistrationHandler.itemEntity.get()))
event.setCanceled(true);
}
}
@SubscribeEvent
public void playerAttack(LivingAttackEvent event)
{
LivingEntity eliving = event.getEntity();
if (eliving instanceof Player player && Settings.dropCarriedWhenHit.get())
{
ItemStack stack = player.getMainHandItem();
if (!stack.isEmpty() && (stack.getItem() == RegistrationHandler.itemTile.get() || stack.getItem() == RegistrationHandler.itemEntity.get()) && !player.level.isClientSide)
{
player.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY);
ItemEntity item = new ItemEntity(player.level, player.getX(), player.getY(), player.getZ(), stack);
sendPacket(player, 9, 0);
player.level.addFreshEntity(item);
}
}
}
@SubscribeEvent(priority = EventPriority.HIGH)
public static void onBlockRightClick(PlayerInteractEvent.RightClickBlock event)
{
Player player = event.getEntity();
if (event.isCanceled())
return;
if (!player.level.isClientSide)
{
ItemStack main = player.getMainHandItem();
ItemStack off = player.getOffhandItem();
Level level = event.getLevel();
BlockPos pos = event.getPos();
BlockState state = level.getBlockState(pos);
if (main.isEmpty() && off.isEmpty() && CarryOnKeybinds.isKeyPressed(player))
{
ItemStack stack = new ItemStack(RegistrationHandler.itemTile.get());
BlockEntity te = level.getBlockEntity(pos);
if (PickupHandler.canPlayerPickUpBlock((ServerPlayer) player, te, level, pos))
{
player.closeContainer();
level.levelEvent(1010, pos, 0);
if (ItemCarryonBlock.storeTileData(te, level, pos, state, stack))
{
BlockState statee = level.getBlockState(pos);
CompoundTag tag = new CompoundTag();
tag = level.getBlockEntity(pos) != null ? level.getBlockEntity(pos).saveWithId() : tag;
CarryOnOverride override = ScriptChecker.inspectBlock(state, level, pos, tag);
int overrideHash = 0;
if (override != null)
overrideHash = override.hashCode();
boolean success = false;
try
{
sendPacket(player, player.getInventory().selected, overrideHash);
level.removeBlockEntity(pos);
level.removeBlock(pos, false);
player.setItemInHand(InteractionHand.MAIN_HAND, stack);
event.setUseBlock(Result.DENY);
event.setUseItem(Result.DENY);
event.setCanceled(true);
success = true;
}
catch (Exception e)
{
try
{
sendPacket(player, player.getInventory().selected, overrideHash);
emptyTileEntity(te);
level.removeBlock(pos, false);
player.setItemInHand(InteractionHand.MAIN_HAND, stack);
event.setUseBlock(Result.DENY);
event.setUseItem(Result.DENY);
event.setCanceled(true);
success = true;
}
catch (Exception ex)
{
sendPacket(player, 9, 0);
level.setBlockAndUpdate(pos, statee);
if (!tag.isEmpty())
{
BlockEntity.loadStatic(pos, statee, tag);
}
player.displayClientMessage(Component.literal(ChatFormatting.RED + "Error detected. Cannot pick up block."), false);
Component s = Component.literal(ChatFormatting.GOLD + "here");
s.getStyle().withClickEvent(new ClickEvent(Action.OPEN_URL, "https://github.com/Tschipp/CarryOn/issues"));
player.displayClientMessage(Component.literal(ChatFormatting.RED + "Please report this error ").append(s), false);
}
}
if (success && override != null)
{
String command = override.getCommandInit();
if (command != null)
player.getServer().getCommands().performCommand(player.getServer().createCommandSourceStack(), "/execute as " + player.getGameProfile().getName() + " run " + command);
}
}
}
}
}
}
public static void emptyTileEntity(BlockEntity te)
{
if (te != null)
{
for (Direction facing : Direction.values())
{
LazyOptional<IItemHandler> itemHandler = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, facing);
itemHandler.ifPresent(handler -> {
for (int i = 0; i < handler.getSlots(); i++)
{
handler.extractItem(i, 64, false);
}
});
}
LazyOptional<IItemHandler> itemHandler = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null);
itemHandler.ifPresent(handler -> {
for (int i = 0; i < handler.getSlots(); i++)
{
handler.extractItem(i, 64, false);
}
});
if (te instanceof Container inv)
{
inv.clearContent();
}
if (te instanceof IItemHandler itemHandler1)
{
for (int i = 0; i < itemHandler1.getSlots(); i++)
{
itemHandler1.extractItem(i, 64, false);
}
}
te.setChanged();
}
}
@SubscribeEvent
public void onRespawn(PlayerEvent.Clone event)
{
Player original = event.getOriginal();
Player player = event.getEntity();
boolean wasDead = event.isWasDeath();
GameRules rules = player.level.getGameRules();
boolean keepInv = rules.getBoolean(GameRules.RULE_KEEPINVENTORY);
boolean wasCarrying = player.getInventory().contains(new ItemStack(RegistrationHandler.itemTile.get())) || player.getInventory().contains(new ItemStack(RegistrationHandler.itemEntity.get()));
if ((wasDead ? keepInv : true) && wasCarrying)
{
int carrySlot = original.getInventory().selected;
ItemStack stack = player.getInventory().removeItemNoUpdate(carrySlot);
Level level = player.level;
ItemEntity item = new ItemEntity(level, 0, 0, 0, stack);
BlockPos pos = null;
Optional<BlockPos> bedpos = original.getSleepingPos();
if (bedpos.isPresent())
pos = bedpos.get();
if (pos == null)
pos = player.blockPosition();
item.setPos(pos.getX(), pos.getY(), pos.getZ());
level.addFreshEntity(item);
}
}
@SubscribeEvent
public void dropNonHotbarItems(LivingTickEvent event)
{
LivingEntity entity = event.getEntity();
if (entity instanceof Player player && !entity.level.isClientSide)
{
boolean hasCarried = player.getInventory().contains(new ItemStack(RegistrationHandler.itemTile.get())) || player.getInventory().contains(new ItemStack(RegistrationHandler.itemEntity.get()));
ItemStack inHand = player.getMainHandItem();
if (hasCarried && inHand.getItem() != RegistrationHandler.itemTile.get() && inHand.getItem() != RegistrationHandler.itemEntity.get() && player.getDimensionChangingDelay() == 0)
{
int slotBlock = this.getSlot(player, RegistrationHandler.itemTile.get());
int slotEntity = this.getSlot(player, RegistrationHandler.itemEntity.get());
ItemEntity item = null;
if (slotBlock != -1)
{
ItemStack dropped = player.getInventory().removeItemNoUpdate(slotBlock);
item = new ItemEntity(player.level, player.getX(), player.getY(), player.getZ(), dropped);
}
if (slotEntity != -1)
{
ItemStack dropped = player.getInventory().removeItemNoUpdate(slotEntity);
item = new ItemEntity(player.level, player.getX(), player.getY(), player.getZ(), dropped);
}
if (item != null)
{
player.level.addFreshEntity(item);
sendPacket(player, 9, 0);
}
}
CarryOnOverride override = ScriptChecker.getOverride(player);
if (override != null)
{
String command = override.getCommandLoop();
if (command != null)
player.getServer().getCommands().performCommand(player.getServer().createCommandSourceStack(), "/execute as " + player.getGameProfile().getName() + " run " + command);
}
}
}
public int getSlot(Player player, Item item)
{
for (int i = 0; i < player.getInventory().getContainerSize(); i++)
{
ItemStack stack = player.getInventory().getItem(i);
if (stack.getItem() == item)
return i;
}
return -1;
}
public static void sendPacket(Player player, int currentItem, int hash)
{
if (player instanceof ServerPlayer)
{
CarryOn.network.send(PacketDistributor.NEAR.with(() -> new TargetPoint(player.getX(), player.getY(), player.getZ(), 128, player.level.dimension())), new CarrySlotPacket(currentItem, player.getId(), hash));
CarryOn.network.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new CarrySlotPacket(currentItem, player.getId(), hash));
if (currentItem >= 9)
{
player.getPersistentData().remove("carrySlot");
player.getPersistentData().remove("overrideKey");
}
else
{
player.getPersistentData().putInt("carrySlot", currentItem);
if (hash != 0)
ScriptChecker.setCarryOnOverride(player, hash);
}
}
}
}

View File

@ -1,117 +0,0 @@
package tschipp.carryon.common.handler;
import java.util.HashMap;
import java.util.List;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.registries.ForgeRegistries;
import tschipp.carryon.common.config.Configs.CustomPickupConditions;
import tschipp.carryon.common.helper.InvalidConfigException;
import tschipp.carryon.common.helper.StringParser;
public class CustomPickupOverrideHandler
{
public static HashMap<String, String> PICKUP_CONDITIONS = new HashMap<>();
public static HashMap<String, String> PICKUP_CONDITIONS_ENTITIES = new HashMap<>();
@SuppressWarnings("unchecked")
public static void initPickupOverrides()
{
if (ModList.get().isLoaded("gamestages"))
{
List<String> conditions = (List<String>) CustomPickupConditions.customPickupConditionsBlocks.get();
for (int i = 0; i < conditions.size(); i++)
{
String line = conditions.get(i);
if (!line.contains("(") || !line.contains(")"))
new InvalidConfigException("Invalid Condition at line " + i + ": " + line).printException();
String condition = line.substring(line.indexOf("("));
String blockname = line.replace(condition, "");
condition = condition.replace("(", "");
condition = condition.replace(")", "");
if (blockname.contains("*"))
{
String modid = blockname.replace("*", "");
for (int k = 0; k < ForgeRegistries.BLOCKS.getKeys().size(); k++)
{
if (ForgeRegistries.BLOCKS.getKeys().toArray()[k].toString().contains(modid))
{
PICKUP_CONDITIONS.put(ForgeRegistries.BLOCKS.getKeys().toArray()[k].toString(), condition);
}
}
}
else
{
PICKUP_CONDITIONS.put(blockname, condition);
}
}
List<String> entityConditions = (List<String>) CustomPickupConditions.customPickupConditionsEntities.get();
for (int i = 0; i < entityConditions.size(); i++)
{
String line = entityConditions.get(i);
if (!line.contains("(") || !line.contains(")"))
new InvalidConfigException("Invalid Condition at line " + i + ": " + line).printException();
String condition = line.substring(line.indexOf("("));
String entityname = line.replace(condition, "");
condition = condition.replace("(", "");
condition = condition.replace(")", "");
PICKUP_CONDITIONS_ENTITIES.put(entityname, condition);
}
}
}
public static boolean hasSpecialPickupConditions(BlockState state)
{
if (!ModList.get().isLoaded("gamestages"))
return false;
for (String cond : PICKUP_CONDITIONS.keySet())
{
if(state == StringParser.getBlockState(cond));
return true;
}
return false;
}
public static String getPickupCondition(BlockState state)
{
for (String cond : PICKUP_CONDITIONS.keySet())
{
if(state == StringParser.getBlockState(cond));
return PICKUP_CONDITIONS.get(cond);
}
return null;
}
public static boolean hasSpecialPickupConditions(Entity entity)
{
if (!ModList.get().isLoaded("gamestages"))
return false;
String name = ForgeRegistries.ENTITY_TYPES.getKey(entity.getType()).toString();
return PICKUP_CONDITIONS_ENTITIES.containsKey(name);
}
public static String getPickupCondition(Entity entity)
{
String name = ForgeRegistries.ENTITY_TYPES.getKey(entity.getType()).toString();
return PICKUP_CONDITIONS_ENTITIES.get(name);
}
}

View File

@ -1,367 +0,0 @@
package tschipp.carryon.common.handler;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.TagKey;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.level.block.Block;
import net.minecraftforge.registries.ForgeRegistries;
import tschipp.carryon.common.config.Configs;
import tschipp.carryon.common.config.Configs.Blacklist;
import tschipp.carryon.common.config.Configs.WhiteList;
public class ListHandler
{
public static List<String> FORBIDDEN_TILES = new ArrayList<>();
public static List<String> FORBIDDEN_ENTITIES = new ArrayList<>();
public static List<String> ALLOWED_ENTITIES = new ArrayList<>();
public static List<String> ALLOWED_TILES = new ArrayList<>();
public static List<String> FORBIDDEN_STACKING = new ArrayList<>();
public static List<String> ALLOWED_STACKING = new ArrayList<>();
public static List<TagKey<Block>> FORBIDDEN_TILES_TAGS = new ArrayList<>();
public static List<TagKey<EntityType<?>>> FORBIDDEN_ENTITIES_TAGS = new ArrayList<>();
public static List<TagKey<EntityType<?>>> ALLOWED_ENTITIES_TAGS = new ArrayList<>();
public static List<TagKey<Block>> ALLOWED_TILES_TAGS = new ArrayList<>();
public static List<TagKey<EntityType<?>>> FORBIDDEN_STACKING_TAGS = new ArrayList<>();
public static List<TagKey<EntityType<?>>> ALLOWED_STACKING_TAGS = new ArrayList<>();
public static boolean isForbidden(Block block)
{
String name = ForgeRegistries.BLOCKS.getKey(block).toString();
if (FORBIDDEN_TILES.contains(name))
return true;
else
{
boolean contains = false;
for (String s : FORBIDDEN_TILES)
{
if (s.contains("*"))
{
String[] filter = s.replace("*", ",").split(",");
if (containsAll(name, filter))
contains = true;
}
}
for (TagKey<Block> tag : FORBIDDEN_TILES_TAGS)
{
if (block.defaultBlockState().is(tag))
return true;
}
return contains;
}
}
public static boolean isForbidden(Entity entity)
{
String name = ForgeRegistries.ENTITY_TYPES.getKey(entity.getType()).toString();
boolean contains = FORBIDDEN_ENTITIES.contains(name);
for (TagKey<EntityType<?>> tag : FORBIDDEN_ENTITIES_TAGS)
{
if (entity.getType().is(tag))
return true;
}
return contains;
}
public static boolean isAllowed(Entity entity)
{
String name = ForgeRegistries.ENTITY_TYPES.getKey(entity.getType()).toString();
boolean contains = ALLOWED_ENTITIES.contains(name);
for (TagKey<EntityType<?>> tag : ALLOWED_ENTITIES_TAGS)
{
if (entity.getType().is(tag))
return true;
}
return contains;
}
public static boolean isStackingForbidden(Entity entity)
{
String name = ForgeRegistries.ENTITY_TYPES.getKey(entity.getType()).toString();
boolean contains = FORBIDDEN_STACKING.contains(name);
for (TagKey<EntityType<?>> tag : FORBIDDEN_STACKING_TAGS)
{
if (entity.getType().is(tag))
return true;
}
return contains;
}
public static boolean isStackingAllowed(Entity entity)
{
String name = ForgeRegistries.ENTITY_TYPES.getKey(entity.getType()).toString();
boolean contains = ALLOWED_STACKING.contains(name);
for (TagKey<EntityType<?>> tag : ALLOWED_STACKING_TAGS)
{
if (entity.getType().is(tag))
return true;
}
return contains;
}
public static boolean isAllowed(Block block)
{
String name = ForgeRegistries.BLOCKS.getKey(block).toString();
if (ALLOWED_TILES.contains(name))
return true;
else
{
boolean contains = false;
for (String s : ALLOWED_TILES)
{
if (s.contains("*"))
{
String[] filter = s.replace("*", ",").split(",");
if (containsAll(name, filter))
contains = true;
}
}
for (TagKey<Block> tag : ALLOWED_TILES_TAGS)
{
if (block.defaultBlockState().is(tag))
return true;
}
return contains;
}
}
@SuppressWarnings("deprecation")
public static void initConfigLists()
{
if(!Configs.SERVER_LOADED)
return;
FORBIDDEN_ENTITIES.clear();
FORBIDDEN_ENTITIES_TAGS.clear();
FORBIDDEN_STACKING.clear();
FORBIDDEN_STACKING_TAGS.clear();
FORBIDDEN_TILES.clear();
FORBIDDEN_TILES_TAGS.clear();
ALLOWED_ENTITIES.clear();
ALLOWED_ENTITIES_TAGS.clear();
ALLOWED_STACKING.clear();
ALLOWED_STACKING_TAGS.clear();
ALLOWED_TILES.clear();
ALLOWED_TILES_TAGS.clear();
List<String> forbidden = new ArrayList<>(Blacklist.forbiddenTiles.get());
forbidden.add("#carryon:block_blacklist");
FORBIDDEN_TILES = new ArrayList<>();
for (int i = 0; i < forbidden.size(); i++)
{
if (!forbidden.get(i).startsWith("#"))
FORBIDDEN_TILES.add(forbidden.get(i));
}
List<String> forbiddenEntity = new ArrayList<>(Blacklist.forbiddenEntities.get());
forbiddenEntity.add("#carryon:entity_blacklist");
FORBIDDEN_ENTITIES = new ArrayList<>();
for (int i = 0; i < forbiddenEntity.size(); i++)
{
if (!forbiddenEntity.get(i).startsWith("#"))
{
if (forbiddenEntity.get(i).contains("*"))
{
String[] filter = forbiddenEntity.get(i).replace("*", ",").split(",");
ResourceLocation[] keys = ForgeRegistries.ENTITY_TYPES.getKeys().toArray(new ResourceLocation[0]);
for (ResourceLocation key : keys)
{
if (containsAll(key.toString(), filter))
{
FORBIDDEN_ENTITIES.add(key.toString());
}
}
}
FORBIDDEN_ENTITIES.add(forbiddenEntity.get(i));
}
}
List<String> allowedEntities = new ArrayList<>(WhiteList.allowedEntities.get());
allowedEntities.add("#carryon:entity_whitelist");
ALLOWED_ENTITIES = new ArrayList<>();
for (int i = 0; i < allowedEntities.size(); i++)
{
if (!allowedEntities.get(i).startsWith("#"))
{
if (allowedEntities.get(i).contains("*"))
{
String[] filter = allowedEntities.get(i).replace("*", ",").split(",");
ResourceLocation[] keys = ForgeRegistries.ENTITY_TYPES.getKeys().toArray(new ResourceLocation[0]);
for (ResourceLocation key : keys)
{
if (containsAll(key.toString(), filter))
{
ALLOWED_ENTITIES.add(key.toString());
}
}
}
ALLOWED_ENTITIES.add(allowedEntities.get(i));
}
}
List<String> allowedBlocks = new ArrayList<>(WhiteList.allowedBlocks.get());
allowedBlocks.add("#carryon:block_whitelist");
ALLOWED_TILES = new ArrayList<>();
for (int i = 0; i < allowedBlocks.size(); i++)
{
if (!allowedBlocks.get(i).startsWith("#"))
ALLOWED_TILES.add(allowedBlocks.get(i));
}
List<String> forbiddenStacking = new ArrayList<>(Blacklist.forbiddenStacking.get());
forbiddenStacking.add("#carryon:stacking_blacklist");
FORBIDDEN_STACKING = new ArrayList<>();
for (int i = 0; i < forbiddenStacking.size(); i++)
{
if (!forbiddenStacking.get(i).startsWith("#"))
{
if (forbiddenStacking.get(i).contains("*"))
{
String[] filter = forbiddenStacking.get(i).replace("*", ",").split(",");
ResourceLocation[] keys = ForgeRegistries.ENTITY_TYPES.getKeys().toArray(new ResourceLocation[0]);
for (ResourceLocation key : keys)
{
if (containsAll(key.toString(), filter))
{
FORBIDDEN_STACKING.add(key.toString());
}
}
}
FORBIDDEN_STACKING.add(forbiddenStacking.get(i));
}
}
List<String> allowedStacking = new ArrayList<>(WhiteList.allowedStacking.get());
allowedStacking.add("#carryon:stacking_whitelist");
ALLOWED_STACKING = new ArrayList<>();
for (int i = 0; i < allowedStacking.size(); i++)
{
if (!allowedStacking.get(i).startsWith("#"))
{
if (allowedStacking.get(i).contains("*"))
{
String[] filter = allowedStacking.get(i).replace("*", ",").split(",");
ResourceLocation[] keys = ForgeRegistries.ENTITY_TYPES.getKeys().toArray(new ResourceLocation[0]);
for (ResourceLocation key : keys)
{
if (containsAll(key.toString(), filter))
{
ALLOWED_STACKING.add(key.toString());
}
}
}
ALLOWED_STACKING.add(allowedStacking.get(i));
}
}
Map<ResourceLocation, TagKey<Block>> blocktags = Registry.BLOCK.getTagNames().collect(Collectors.toMap(t -> t.location(), t -> t));
Map<ResourceLocation, TagKey<EntityType<?>>> entitytags = Registry.ENTITY_TYPE.getTagNames().collect(Collectors.toMap(t -> t.location(), t -> t));
// System.out.println(blocktags.getAvailableTags());
for (String s : forbidden)
{
if (s.startsWith("#"))
{
String sub = s.substring(1);
TagKey<Block> tag = blocktags.get(new ResourceLocation(sub));
if (tag != null)
FORBIDDEN_TILES_TAGS.add(tag);
}
}
for (String s : allowedBlocks)
{
if (s.startsWith("#"))
{
TagKey<Block> tag = blocktags.get(new ResourceLocation(s.substring(1)));
if (tag != null)
ALLOWED_TILES_TAGS.add(tag);
}
}
for (String s : forbiddenEntity)
{
if (s.startsWith("#"))
{
TagKey<EntityType<?>> tag = entitytags.get(new ResourceLocation(s.substring(1)));
if (tag != null)
FORBIDDEN_ENTITIES_TAGS.add(tag);
}
}
for (String s : allowedEntities)
{
if (s.startsWith("#"))
{
TagKey<EntityType<?>> tag = entitytags.get(new ResourceLocation(s.substring(1)));
if (tag != null)
ALLOWED_ENTITIES_TAGS.add(tag);
}
}
for (String s : forbiddenStacking)
{
if (s.startsWith("#"))
{
TagKey<EntityType<?>> tag = entitytags.get(new ResourceLocation(s.substring(1)));
if (tag != null)
FORBIDDEN_STACKING_TAGS.add(tag);
}
}
for (String s : allowedStacking)
{
if (s.startsWith("#"))
{
TagKey<EntityType<?>> tag = entitytags.get(new ResourceLocation(s.substring(1)));
if (tag != null)
ALLOWED_STACKING_TAGS.add(tag);
}
}
}
public static boolean containsAll(String str, String... strings)
{
boolean containsAll = true;
for (String s : strings)
{
if (!str.contains(s))
containsAll = false;
}
return containsAll;
}
}

View File

@ -1,270 +0,0 @@
package tschipp.carryon.common.handler;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import net.minecraft.client.Minecraft;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtUtils;
import net.minecraft.nbt.TagParser;
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.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.registries.ForgeRegistries;
import tschipp.carryon.common.config.Configs.ModelOverrides;
import tschipp.carryon.common.helper.InvalidConfigException;
import tschipp.carryon.common.helper.StringParser;
public class ModelOverridesHandler
{
public static HashMap<CompoundTag, Object> OVERRIDE_OBJECTS = new HashMap<>();
/*
* This class is really ugly, will probably be replaced by something else -
* Tschipp
*/
public static void parseOverride(String overrideString, int i)
{
boolean errored = false;
Object toOverrideObject;
Object overrideObject;
CompoundTag tag = new CompoundTag();
String currentline = overrideString;
if (StringUtils.isEmpty(currentline) || !StringUtils.contains(currentline, "->"))
new InvalidConfigException("Missing Override Model at line " + i + " : " + currentline).printException();
String[] sa = currentline.split("->");
String toOverride = "";
String override = "";
try
{
toOverride = sa[0];
override = sa[1];
}
catch (ArrayIndexOutOfBoundsException e)
{
errored = true;
new InvalidConfigException("Missing Override Model at line " + i + " : " + currentline).printException();
}
if (toOverride.contains("{"))
{
if (!toOverride.contains("}"))
{
errored = true;
new InvalidConfigException("Missing } at line " + i + " : " + currentline).printException();
}
String nbt = toOverride.substring(toOverride.indexOf("{"));
toOverride = toOverride.replace(nbt, "");
try
{
tag = TagParser.parseTag(nbt);
}
catch (Exception e)
{
errored = true;
new InvalidConfigException("Error while parsing NBT at line " + i + " : " + e.getMessage()).printException();
}
}
else if (toOverride.contains("}"))
{
errored = true;
new InvalidConfigException("Missing { at line " + i + " : " + currentline).printException();
}
String overridetype = "item";
if (override.contains("("))
{
if (!override.contains(")"))
{
errored = true;
new InvalidConfigException("Missing ) at line " + i + " : " + currentline).printException();
}
overridetype = override.substring(0, override.indexOf(")") + 1);
override = override.replace(overridetype, "");
overridetype = overridetype.replace("(", "");
overridetype = overridetype.replace(")", "");
}
else if (override.contains(")"))
{
errored = true;
new InvalidConfigException("Missing ( at line " + i + " : " + currentline).printException();
}
String modidToOverride = "minecraft";
String modidOverride = "minecraft";
if (toOverride.contains(":"))
modidToOverride = toOverride.replace(toOverride.substring(toOverride.indexOf(":")), "");
if (override.contains(":"))
modidOverride = override.replace(override.substring(override.indexOf(":")), "");
if ((ModList.get().isLoaded(modidOverride) || modidOverride.equals("minecraft")) && (ModList.get().isLoaded(modidToOverride) || modidToOverride.equals("minecraft")) && !errored)
{
toOverrideObject = StringParser.getBlockState(toOverride);
if (toOverrideObject != null)
{
if (overridetype.equals("block"))
overrideObject = StringParser.getBlockState(override);
else
overrideObject = StringParser.getItemStack(override);
if (overrideObject != null)
{
CompoundTag keyComp = new CompoundTag();
keyComp.put("nbttag", tag);
if (toOverrideObject instanceof Block)
{
keyComp.putString("block", ForgeRegistries.BLOCKS.getKey(((Block) toOverrideObject)).toString());
}
else
{
keyComp.putInt("stateid", Block.getId((BlockState) toOverrideObject));
keyComp.putString("block", ForgeRegistries.BLOCKS.getKey(((BlockState) toOverrideObject).getBlock()).toString());
}
OVERRIDE_OBJECTS.put(keyComp, overrideObject);
}
}
}
}
public static void initOverrides()
{
@SuppressWarnings("unchecked")
List<String> overrides = (List<String>) ModelOverrides.modelOverrides.get();
for (int i = 0; i < overrides.size(); i++)
{
parseOverride(overrides.get(i), i);
}
}
public static boolean hasCustomOverrideModel(BlockState state, CompoundTag tag)
{
if (OVERRIDE_OBJECTS.isEmpty())
return false;
int stateid = Block.getId(state);
CompoundTag[] keys = new CompoundTag[OVERRIDE_OBJECTS.size()];
OVERRIDE_OBJECTS.keySet().toArray(keys);
for (CompoundTag key : keys)
{
int id = key.getInt("stateid");
Block block = StringParser.getBlock(key.getString("block"));
if (id == 0 ? block == state.getBlock() : id == stateid)
{
CompoundTag toCheckForCompound = key.getCompound("nbttag");
Set<String> kSetToCheck = toCheckForCompound.getAllKeys();
Set<String> kSetTile = tag.getAllKeys();
boolean flag = true;
if (kSetTile.containsAll(kSetToCheck))
{
for (String skey : kSetToCheck)
{
if (!NbtUtils.compareNbt(tag.get(skey), toCheckForCompound.get(skey), true))
flag = false;
}
if (flag)
return true;
}
}
}
return false;
}
@OnlyIn(Dist.CLIENT)
public static BakedModel getCustomOverrideModel(BlockState state, CompoundTag tag, Level level, Player player)
{
int stateid = Block.getId(state);
CompoundTag[] keys = new CompoundTag[OVERRIDE_OBJECTS.size()];
OVERRIDE_OBJECTS.keySet().toArray(keys);
for (CompoundTag key : keys)
{
int id = key.getInt("stateid");
Block block = StringParser.getBlock(key.getString("block"));
if (id == 0 ? block == state.getBlock() : id == stateid)
{
CompoundTag toCheckForCompound = key.getCompound("nbttag");
Set<String> kSetToCheck = toCheckForCompound.getAllKeys();
Set<String> kSetTile = tag.getAllKeys();
boolean flag = true;
if (kSetTile.containsAll(kSetToCheck))
{
for (String skey : kSetToCheck)
{
if (!NbtUtils.compareNbt(tag.get(skey), toCheckForCompound.get(skey), true))
flag = false;
}
if (flag)
{
Object override = OVERRIDE_OBJECTS.get(key);
if (override == null)
return null;
if (override instanceof BlockState)
return Minecraft.getInstance().getBlockRenderer().getBlockModel((BlockState) override);
else
return Minecraft.getInstance().getItemRenderer().getModel((ItemStack) override, level, player, 0);
}
}
}
}
return null;
}
public static Object getOverrideObject(BlockState state, CompoundTag tag)
{
int stateid = Block.getId(state);
CompoundTag[] keys = new CompoundTag[OVERRIDE_OBJECTS.size()];
OVERRIDE_OBJECTS.keySet().toArray(keys);
for (CompoundTag key : keys)
{
int id = key.getInt("stateid");
Block block = StringParser.getBlock(key.getString("block"));
if (id == 0 ? block == state.getBlock() : id == stateid)
{
CompoundTag toCheckForCompound = key.getCompound("nbttag");
Set<String> kSetToCheck = toCheckForCompound.getAllKeys();
Set<String> kSetTile = tag.getAllKeys();
boolean flag = true;
if (kSetTile.containsAll(kSetToCheck))
{
for (String skey : kSetToCheck)
{
if (!NbtUtils.compareNbt(tag.get(skey), toCheckForCompound.get(skey), true))
flag = false;
}
if (flag)
{
return OVERRIDE_OBJECTS.get(key);
}
}
}
}
return null;
}
}

View File

@ -1,201 +0,0 @@
package tschipp.carryon.common.handler;
import java.util.UUID;
import javax.annotation.Nullable;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.AgeableMob;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.MobCategory;
import net.minecraft.world.entity.TamableAnimal;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.GameType;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.player.AttackEntityEvent;
import net.minecraftforge.event.level.BlockEvent;
import tschipp.carryon.common.config.Configs.Settings;
import tschipp.carryon.common.helper.CarryonGamestageHelper;
import tschipp.carryon.common.item.ItemCarryonBlock;
import tschipp.carryon.common.scripting.CarryOnOverride;
import tschipp.carryon.common.scripting.ScriptChecker;
public class PickupHandler
{
public static boolean canPlayerPickUpBlock(ServerPlayer player, @Nullable BlockEntity tile, Level level, BlockPos pos)
{
if (player.gameMode.getGameModeForPlayer() == GameType.SPECTATOR || player.gameMode.getGameModeForPlayer() == GameType.ADVENTURE)
return false;
BlockState state = level.getBlockState(pos);
CompoundTag tag = new CompoundTag();
if (tile != null)
tile.saveWithId();
CarryOnOverride override = ScriptChecker.inspectBlock(level.getBlockState(pos), level, pos, tag);
if (override != null)
{
return ScriptChecker.fulfillsConditions(override, player) && handleProtections(player, level, pos, state);
}
else
{
if (Settings.useWhitelistBlocks.get())
{
if (!ListHandler.isAllowed(level.getBlockState(pos).getBlock()))
{
return false;
}
}
else if (ListHandler.isForbidden(level.getBlockState(pos).getBlock()))
{
return false;
}
if (state.getDestroySpeed(level, pos) != -1 || player.isCreative())
{
double distance = Vec3.atLowerCornerOf(pos).distanceTo(player.position());
double maxDist = Settings.maxDistance.get();
if (distance < maxDist && !ItemCarryonBlock.isLocked(pos, level))
{
if (CustomPickupOverrideHandler.hasSpecialPickupConditions(state))
{
return CarryonGamestageHelper.hasGamestage(CustomPickupOverrideHandler.getPickupCondition(state), player) && handleProtections(player, level, pos, state);
}
else if (Settings.pickupAllBlocks.get() ? true : tile != null)
{
return handleProtections(player, level, pos, state);
}
}
}
}
return false;
}
public static boolean canPlayerPickUpEntity(ServerPlayer player, Entity toPickUp)
{
if (player.gameMode.getGameModeForPlayer() == GameType.SPECTATOR || player.gameMode.getGameModeForPlayer() == GameType.ADVENTURE)
return false;
Vec3 pos = toPickUp.position();
if (toPickUp instanceof Player)
return false;
CarryOnOverride override = ScriptChecker.inspectEntity(toPickUp);
if (override != null)
{
return ScriptChecker.fulfillsConditions(override, player) && handleProtections(player, toPickUp);
}
else
{
if (toPickUp instanceof AgeableMob living && Settings.allowBabies.get() && (living.getAge() < 0 || living.isBaby()))
{
double distance = pos.distanceToSqr(player.position());
if (distance <= Math.pow(Settings.maxDistance.get(), 2) && toPickUp instanceof TamableAnimal tame && tame.getOwnerUUID() != null && tame.getOwnerUUID() != player.getGameProfile().getId())
return false;
if (CustomPickupOverrideHandler.hasSpecialPickupConditions(toPickUp))
{
return CarryonGamestageHelper.hasGamestage(CustomPickupOverrideHandler.getPickupCondition(toPickUp), player) && handleProtections(player, toPickUp);
}
else
return handleProtections(player, toPickUp);
}
if (Settings.useWhitelistEntities.get())
{
if (!ListHandler.isAllowed(toPickUp))
{
return false;
}
}
else if (ListHandler.isForbidden(toPickUp))
{
return false;
}
if ((Settings.pickupHostileMobs.get() ? true : toPickUp.getType().getCategory() != MobCategory.MONSTER || player.isCreative()) && (Settings.pickupHostileMobs.get() ? true : toPickUp.getType().getCategory() != MobCategory.MONSTER || player.isCreative()))
{
if (toPickUp.getBbHeight() <= Settings.maxEntityHeight.get() && toPickUp.getBbWidth() <= Settings.maxEntityWidth.get() || player.isCreative())
{
double distance = pos.distanceToSqr(player.position());
if (distance < Math.pow(Settings.maxDistance.get(), 2))
{
if (toPickUp instanceof TamableAnimal tame)
{
UUID owner = tame.getOwnerUUID();
UUID playerID = player.getGameProfile().getId();
if (owner != null && !owner.equals(playerID))
return false;
}
if (CustomPickupOverrideHandler.hasSpecialPickupConditions(toPickUp))
{
return CarryonGamestageHelper.hasGamestage(CustomPickupOverrideHandler.getPickupCondition(toPickUp), player) && handleProtections(player, toPickUp);
}
else
return handleProtections(player, toPickUp);
}
}
}
}
return false;
}
public static class PickUpBlockEvent extends BlockEvent.BreakEvent
{
public PickUpBlockEvent(Level level, BlockPos pos, BlockState state, Player player)
{
super(level, pos, state, player);
}
}
public static class PickUpEntityEvent extends AttackEntityEvent
{
public PickUpEntityEvent(Player player, Entity target)
{
super(player, target);
}
}
private static boolean handleProtections(ServerPlayer player, Level level, BlockPos pos, BlockState state)
{
boolean breakable = true;
PickUpBlockEvent event = new PickUpBlockEvent(level, pos, state, player);
MinecraftForge.EVENT_BUS.post(event);
if (event.isCanceled())
breakable = false;
return breakable;
}
private static boolean handleProtections(ServerPlayer player, Entity entity)
{
boolean canPickup = true;
PickUpEntityEvent event = new PickUpEntityEvent(player, entity);
MinecraftForge.EVENT_BUS.post(event);
if (event.isCanceled())
canPickup = false;
return canPickup;
}
}

View File

@ -1,71 +0,0 @@
package tschipp.carryon.common.handler;
import net.minecraft.world.item.Item;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
import tschipp.carryon.CarryOn;
import tschipp.carryon.client.event.RenderEntityEvents;
import tschipp.carryon.client.event.RenderEvents;
import tschipp.carryon.common.capabilities.IPosition;
import tschipp.carryon.common.capabilities.event.PositionClientEvents;
import tschipp.carryon.common.capabilities.event.PositionCommonEvents;
import tschipp.carryon.common.event.IMCEvents;
import tschipp.carryon.common.event.ItemEntityEvents;
import tschipp.carryon.common.event.ItemEvents;
import tschipp.carryon.common.item.ItemCarryonBlock;
import tschipp.carryon.common.item.ItemCarryonEntity;
@EventBusSubscriber(modid = CarryOn.MODID, bus = Bus.MOD)
public class RegistrationHandler
{
private static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, CarryOn.MODID);
public static final RegistryObject<Item> itemTile = ITEMS.register("tile_item", () -> new ItemCarryonBlock());
public static final RegistryObject<Item> itemEntity = ITEMS.register("entity_item", () -> new ItemCarryonEntity());
public static void init() {
ITEMS.register(FMLJavaModLoadingContext.get().getModEventBus());
}
public static void regCommonEvents()
{
MinecraftForge.EVENT_BUS.register(new ItemEvents());
MinecraftForge.EVENT_BUS.register(new ItemEntityEvents());
MinecraftForge.EVENT_BUS.register(new PositionCommonEvents());
MinecraftForge.EVENT_BUS.register(new IMCEvents());
}
public static void regClientEvents()
{
MinecraftForge.EVENT_BUS.register(new RenderEvents());
MinecraftForge.EVENT_BUS.register(new RenderEntityEvents());
MinecraftForge.EVENT_BUS.register(new PositionClientEvents());
// if(ModList.get().isLoaded("obfuscate"))
// MinecraftForge.EVENT_BUS.register(new ObfuscateEvents());
}
public static void regOverrideList()
{
ModelOverridesHandler.initOverrides();
CustomPickupOverrideHandler.initPickupOverrides();
// ListHandler.initConfigLists();
}
@SubscribeEvent
public static void regCaps(RegisterCapabilitiesEvent event)
{
event.register(IPosition.class);
}
}

View File

@ -1,13 +0,0 @@
package tschipp.carryon.common.helper;
//import net.darkhax.gamestages.GameStageHelper;
import net.minecraft.world.entity.player.Player;
public class CarryonGamestageHelper
{
public static boolean hasGamestage(String stage, Player player)
{
// return GameStageHelper.hasStage(player, stage);
return true;
}
}

View File

@ -1,33 +0,0 @@
package tschipp.carryon.common.helper;
import tschipp.carryon.CarryOn;
public class InvalidConfigException extends Exception
{
private static final long serialVersionUID = -7161004674405185407L;
public InvalidConfigException(String cause)
{
super(cause);
}
public void printException()
{
CarryOn.LOGGER.error(this.getMessage());
for (int i = 0; i < this.getStackTrace().length; i++)
{
StackTraceElement element = this.getStackTrace()[i];
CarryOn.LOGGER.error(element.toString());
if (i >= 10)
{
CarryOn.LOGGER.error(this.getStackTrace().length - 10 + " more...");
break;
}
}
CarryOn.LOGGER.info("");
}
}

View File

@ -1,45 +0,0 @@
package tschipp.carryon.common.helper;
import org.lwjgl.glfw.GLFW;
import org.lwjgl.glfw.GLFWKeyCallback;
import net.minecraft.client.Minecraft;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.Cancelable;
import net.minecraftforge.eventbus.api.Event;
public class KeyboardCallbackWrapper
{
GLFWKeyCallback oldCallback;
public void setup(Minecraft mc)
{
this.oldCallback = GLFW.glfwSetKeyCallback(mc.getWindow().getWindow(), this::keyCallback);
}
private void keyCallback(long window, int key, int scancode, int action, int mods)
{
KeyPressedEvent event = new KeyPressedEvent(key, scancode);
MinecraftForge.EVENT_BUS.post(event);
if (event.isCanceled())
return;
if (this.oldCallback != null)
this.oldCallback.invoke(window, key, scancode, action, mods);
}
@Cancelable
public static class KeyPressedEvent extends Event
{
public int key;
public int scancode;
public KeyPressedEvent(int key, int scancode)
{
this.key = key;
this.scancode = scancode;
}
}
}

View File

@ -1,263 +0,0 @@
/*
* Minecraft Forge
* Copyright (c) 2016.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation version 2.1
* of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package tschipp.carryon.common.helper;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import com.google.common.base.Preconditions;
/**
* Some reflection helper code.
*
* @author cpw
*
*/
public class ReflectionHelper
{
public static class UnableToFindMethodException extends RuntimeException
{
private static final long serialVersionUID = 1L;
// private String[] methodNames;
public UnableToFindMethodException(String[] methodNames, Exception failed)
{
super(failed);
// this.methodNames = methodNames;
}
public UnableToFindMethodException(Throwable failed)
{
super(failed);
}
}
public static class UnableToFindClassException extends RuntimeException
{
private static final long serialVersionUID = 1L;
// private String[] classNames;
public UnableToFindClassException(String[] classNames, @Nullable Exception err)
{
super(err);
// this.classNames = classNames;
}
}
public static class UnableToAccessFieldException extends RuntimeException
{
private static final long serialVersionUID = 1L;
// private String[] fieldNameList;
public UnableToAccessFieldException(String[] fieldNames, Exception e)
{
super(e);
// this.fieldNameList = fieldNames;
}
}
public static class UnableToFindFieldException extends RuntimeException
{
private static final long serialVersionUID = 1L;
// private String[] fieldNameList;
public UnableToFindFieldException(String[] fieldNameList, Exception e)
{
super(e);
// this.fieldNameList = fieldNameList;
}
}
@SuppressWarnings("serial")
public static class UnknownConstructorException extends RuntimeException
{
public UnknownConstructorException(final String message)
{
super(message);
}
}
public static Field findField(Class<?> clazz, String... fieldNames)
{
Exception failed = null;
for (String fieldName : fieldNames)
{
try
{
Field f = clazz.getDeclaredField(fieldName);
f.setAccessible(true);
return f;
}
catch (Exception e)
{
failed = e;
}
}
throw new UnableToFindFieldException(fieldNames, failed);
}
@SuppressWarnings("unchecked")
public static <T, E> T getPrivateValue(Class<? super E> classToAccess, @Nullable E instance, int fieldIndex)
{
try
{
Field f = classToAccess.getDeclaredFields()[fieldIndex];
f.setAccessible(true);
return (T) f.get(instance);
}
catch (Exception e)
{
throw new UnableToAccessFieldException(new String[0], e);
}
}
@SuppressWarnings("unchecked")
public static <T, E> T getPrivateValue(Class<? super E> classToAccess, E instance, String... fieldNames)
{
try
{
return (T) findField(classToAccess, fieldNames).get(instance);
}
catch (Exception e)
{
throw new UnableToAccessFieldException(fieldNames, e);
}
}
public static <T, E> void setPrivateValue(Class<? super T> classToAccess, T instance, E value, int fieldIndex)
{
try
{
Field f = classToAccess.getDeclaredFields()[fieldIndex];
f.setAccessible(true);
f.set(instance, value);
}
catch (Exception e)
{
throw new UnableToAccessFieldException(new String[0], e);
}
}
public static <T, E> void setPrivateValue(Class<? super T> classToAccess, T instance, E value, String... fieldNames)
{
try
{
findField(classToAccess, fieldNames).set(instance, value);
}
catch (Exception e)
{
throw new UnableToAccessFieldException(fieldNames, e);
}
}
@SuppressWarnings("unchecked")
public static Class<? super Object> getClass(ClassLoader loader, String... classNames)
{
Exception err = null;
for (String className : classNames)
{
try
{
return (Class<? super Object>) Class.forName(className, false, loader);
}
catch (Exception e)
{
err = e;
}
}
throw new UnableToFindClassException(classNames, err);
}
/**
* Finds a method with the specified name and parameters in the given class
* and makes it accessible. Note: for performance, store the returned value
* and avoid calling this repeatedly.
* <p>
* Throws an exception if the method is not found.
*
* @param clazz
* The class to find the method on.
* @param methodName
* The name of the method to find (used in developer
* environments, i.e. "getLevelTime").
* @param methodObfName
* The obfuscated name of the method to find (used in obfuscated
* environments, i.e. "getLevelTime"). If the name you are
* looking for is on a class that is never obfuscated, this
* should be null.
* @param parameterTypes
* The parameter types of the method to find.
* @return The method with the specified name and parameters in the given
* class.
*/
/**
* Finds a constructor in the specified class that has matching parameter
* types.
*
* @param klass
* The class to find the constructor in
* @param parameterTypes
* The parameter types of the constructor.
* @param <T>
* The type
* @return The constructor
* @throws NullPointerException
* if {@code klass} is null
* @throws NullPointerException
* if {@code parameterTypes} is null
* @throws UnknownConstructorException
* if the constructor could not be found
*/
@Nonnull
public static <T> Constructor<T> findConstructor(@Nonnull final Class<T> klass, @Nonnull final Class<?>... parameterTypes)
{
Preconditions.checkNotNull(klass, "class");
Preconditions.checkNotNull(parameterTypes, "parameter types");
final Constructor<T> constructor;
try
{
constructor = klass.getDeclaredConstructor(parameterTypes);
constructor.setAccessible(true);
}
catch (final NoSuchMethodException e)
{
final StringBuilder desc = new StringBuilder();
desc.append(klass.getSimpleName()).append('(');
for (int i = 0, length = parameterTypes.length; i < length; i++)
{
desc.append(parameterTypes[i].getName());
if (i > length)
{
desc.append(',').append(' ');
}
}
desc.append(')');
throw new UnknownConstructorException("Could not find constructor '" + desc.toString() + "' in " + klass);
}
return constructor;
}
}

View File

@ -1,90 +0,0 @@
package tschipp.carryon.common.helper;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import javax.annotation.Nullable;
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
/**
* Utility methods for reflection.
*
* @author Choonster
*/
public class ReflectionUtil
{
/**
* Get a {@link MethodHandle} for a method.
*
* @param clazz
* The class
* @param methodName
* The possible names of the method
* @param methodObfName
* The obfuscated method name
* @param parameterTypes
* The argument types of the method
* @return The MethodHandle
*/
public static MethodHandle findMethod(final Class<?> clazz, final String methodName, @Nullable final String methodObfName, final Class<?>... parameterTypes)
{
final Method method = ObfuscationReflectionHelper.findMethod(clazz, methodName, parameterTypes);
try
{
return MethodHandles.lookup().unreflect(method);
}
catch (IllegalAccessException e)
{
throw new ObfuscationReflectionHelper.UnableToFindMethodException(e);
}
}
/**
* Get a {@link MethodHandle} for a field's getter.
*
* @param clazz
* The class
* @param fieldNames
* The possible names of the field
* @return The MethodHandle
*/
public static MethodHandle findFieldGetter(Class<?> clazz, String... fieldNames)
{
final Field field = ReflectionHelper.findField(clazz, fieldNames);
try
{
return MethodHandles.lookup().unreflectGetter(field);
}
catch (IllegalAccessException e)
{
throw new ReflectionHelper.UnableToAccessFieldException(fieldNames, e);
}
}
/**
* Get a {@link MethodHandle} for a field's setter.
*
* @param clazz
* The class
* @param fieldNames
* The possible names of the field
* @return The MethodHandle
*/
public static MethodHandle findFieldSetter(Class<?> clazz, String... fieldNames)
{
final Field field = ReflectionHelper.findField(clazz, fieldNames);
try
{
return MethodHandles.lookup().unreflectSetter(field);
}
catch (IllegalAccessException e)
{
throw new ReflectionHelper.UnableToAccessFieldException(fieldNames, e);
}
}
}

View File

@ -1,355 +0,0 @@
package tschipp.carryon.common.helper;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.Tag;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.material.Material;
import net.minecraft.world.scores.Objective;
import net.minecraft.world.scores.Score;
import net.minecraft.world.scores.Scoreboard;
import net.minecraftforge.registries.ForgeRegistries;
public class ScriptParseHelper
{
public static boolean matches(double number, String cond)
{
if (cond == null || cond.isEmpty())
return true;
try
{
if (cond.contains("<="))
{
return number <= Double.parseDouble(cond.replace("<=", ""));
}
if (cond.contains(">="))
{
return number >= Double.parseDouble(cond.replace(">=", ""));
}
if (cond.contains("<"))
{
return number < Double.parseDouble(cond.replace("<", ""));
}
if (cond.contains(">"))
{
return number > Double.parseDouble(cond.replace(">", ""));
}
if (cond.contains("="))
{
return number == Double.parseDouble(cond.replace("=", ""));
}
else
return number == Double.parseDouble(cond);
}
catch (Exception e)
{
new InvalidConfigException(e.getMessage()).printException();
}
return false;
}
public static boolean matches(Block block, String cond)
{
if (cond == null || cond.isEmpty())
return true;
Block toCheck = StringParser.getBlock(cond);
if (toCheck != null)
return block == toCheck;
return false;
}
public static boolean matches(CompoundTag toCheck, CompoundTag toMatch)
{
if (toCheck == null || toMatch == null || toMatch.isEmpty())
return true;
boolean matching = true;
for (String key : toMatch.getAllKeys())
{
Tag tag = toMatch.get(key);
key = key.replace("\"", "");
Tag tagToCheck = toCheck.get(key);
if (!tag.equals(tagToCheck))
matching = false;
}
return matching;
}
public static float[] getXYZArray(String s)
{
float[] d = new float[3];
d[0] = getValueFromString(s, "x");
d[1] = getValueFromString(s, "y");
d[2] = getValueFromString(s, "z");
return d;
}
public static float[] getScaled(String s)
{
float[] d = new float[3];
d[0] = getScaledValueFromString(s, "x");
d[1] = getScaledValueFromString(s, "y");
d[2] = getScaledValueFromString(s, "z");
return d;
}
public static float getScaledValueFromString(String toGetFrom, String key)
{
if (toGetFrom == null || toGetFrom.isEmpty())
return 1;
String[] s = toGetFrom.split(",");
for (String string : s)
{
if (string.contains(key) && string.contains("="))
{
float numb = 1;
string = string.replace(key + "=", "");
try
{
numb = Float.parseFloat(string);
}
catch (Exception e)
{
}
return numb;
}
}
return 1;
}
public static boolean matchesScore(Player player, String cond)
{
if (cond == null || cond.isEmpty())
return true;
Scoreboard score = player.getScoreboard();
String numb;
String scorename;
int iE = cond.indexOf("=");
int iG = cond.indexOf(">");
int iL = cond.indexOf("<");
if (iG == -1 ? true : iE < iG && iL == -1 ? true : iE < iL && iE != -1)
numb = cond.substring(iE);
else if (iE == -1 ? true : iG < iE && iL == -1 ? true : iG < iL && iG != -1)
numb = cond.substring(iG);
else
numb = cond.substring(iL);
scorename = cond.replace(numb, "");
Map<Objective, Score> o = score.getPlayerScores(player.getGameProfile().getName());
if (o != null)
{
Score sc = o.get(score.getObjective(scorename));
if (sc != null)
{
int points = sc.getScore();
return matches(points, numb);
}
}
return false;
}
public static boolean matches(BlockPos pos, String cond)
{
if (cond == null || cond.isEmpty())
return true;
BlockPos blockpos = new BlockPos(getValueFromString(cond, "x"), getValueFromString(cond, "y"), getValueFromString(cond, "z"));
BlockPos expand = new BlockPos(getValueFromString(cond, "dx"), getValueFromString(cond, "dy"), getValueFromString(cond, "dz"));
BlockPos expanded = blockpos.offset(expand);
boolean x = pos.getX() >= blockpos.getX() && pos.getX() <= expanded.getX() || blockpos.getX() == 0;
boolean y = pos.getY() >= blockpos.getY() && pos.getY() <= expanded.getY() || blockpos.getY() == 0;
boolean z = pos.getZ() >= blockpos.getZ() && pos.getZ() <= expanded.getZ() || blockpos.getZ() == 0;
return x && y && z;
}
public static float getValueFromString(String toGetFrom, String key)
{
if (toGetFrom == null || toGetFrom.isEmpty())
return 0;
String[] s = toGetFrom.split(",");
for (String string : s)
{
if (string.contains(key) && string.contains("="))
{
float numb = 0;
string = string.replace(key + "=", "");
try
{
numb = Float.parseFloat(string);
}
catch (Exception e)
{
}
return numb;
}
}
return 0;
}
public static boolean hasEffects(Player player, String cond)
{
if (cond == null || cond.isEmpty())
return true;
Collection<MobEffectInstance> effects = player.getActiveEffects();
String[] potions = cond.split(",");
List<String> names = new ArrayList<>();
List<Integer> levels = new ArrayList<>();
for (String pot : potions)
{
if (pot.contains("#"))
{
String level = pot.substring(pot.indexOf("#"));
String name = pot.substring(0, pot.indexOf("#"));
level = level.replace("#", "");
int lev = 0;
try
{
lev = Integer.parseInt(level);
}
catch (Exception e)
{
}
levels.add(lev);
names.add(name);
}
else
{
levels.add(0);
names.add(pot);
}
}
int matches = 0;
for (MobEffectInstance effect : effects)
{
int amp = effect.getAmplifier();
String name = ForgeRegistries.MOB_EFFECTS.getKey(effect.getEffect()).toString();
if (names.contains(name))
{
int idx = names.indexOf(name);
int lev = levels.get(idx);
if (lev == amp)
matches++;
}
}
return matches == potions.length;
}
public static boolean matches(Material material, String cond)
{
if (cond == null || cond.isEmpty())
return true;
switch (cond)
{
case "air":
return material == Material.AIR;
case "anvil":
return material == Material.HEAVY_METAL;
case "barrier":
return material == Material.BARRIER;
case "cactus":
return material == Material.CACTUS;
case "cake":
return material == Material.CAKE;
case "carpet":
return material == Material.CLOTH_DECORATION;
case "clay":
return material == Material.CLAY;
case "cloth":
return material == Material.WOOL;
case "dragon_egg":
return material == Material.EGG;
case "fire":
return material == Material.FIRE;
case "glass":
return material == Material.GLASS;
case "gourd":
return material == Material.VEGETABLE;
case "grass":
return material == Material.GRASS;
case "ground":
return material == Material.GRASS;
case "ice":
return material == Material.ICE;
case "iron":
return material == Material.METAL;
case "lava":
return material == Material.LAVA;
case "leaves":
return material == Material.LEAVES;
case "packed_ice":
return material == Material.ICE_SOLID;
case "piston":
return material == Material.PISTON;
case "plants":
return material == Material.PLANT;
case "portal":
return material == Material.PORTAL;
case "redstone_light":
return material == Material.BUILDABLE_GLASS;
case "rock":
return material == Material.STONE;
case "sand":
return material == Material.SAND;
case "snow":
return material == Material.TOP_SNOW;
case "sponge":
return material == Material.SPONGE;
case "structure_void":
return material == Material.STRUCTURAL_AIR;
case "tnt":
return material == Material.EXPLOSIVE;
case "vine":
return material == Material.PLANT;
case "water":
return material == Material.WATER;
case "web":
return material == Material.WEB;
case "wood":
return material == Material.WOOD;
default:
return false;
}
}
}

View File

@ -1,38 +0,0 @@
package tschipp.carryon.common.helper;
import org.lwjgl.glfw.GLFW;
import org.lwjgl.glfw.GLFWScrollCallback;
import net.minecraft.client.Minecraft;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.Cancelable;
import net.minecraftforge.eventbus.api.Event;
//Thanks to gigaherz for the help!
public class ScrollCallbackWrapper
{
GLFWScrollCallback oldCallback;
public void setup(Minecraft mc)
{
this.oldCallback = GLFW.glfwSetScrollCallback(mc.getWindow().getWindow(), this::scrollCallback);
}
private void scrollCallback(long window, double xoffset, double yoffset)
{
MouseScrolledEvent event = new MouseScrolledEvent();
MinecraftForge.EVENT_BUS.post(event);
if (event.isCanceled())
return;
if (this.oldCallback != null)
this.oldCallback.invoke(window, xoffset, yoffset);
}
@Cancelable
public static class MouseScrolledEvent extends Event
{
}
}

View File

@ -1,133 +0,0 @@
package tschipp.carryon.common.helper;
import javax.annotation.Nullable;
import com.mojang.brigadier.StringReader;
import net.minecraft.commands.arguments.blocks.BlockStateParser;
import net.minecraft.commands.arguments.blocks.BlockStateParser.BlockResult;
import net.minecraft.commands.arguments.item.ItemParser;
import net.minecraft.commands.arguments.item.ItemParser.ItemResult;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.Registry;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.TagParser;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
public class StringParser
{
@Nullable
public static Block getBlock(String string)
{
BlockState state = getBlockState(string);
if (state != null)
return state.getBlock();
return null;
}
@Nullable
public static BlockState getBlockState(String string)
{
if (string == null)
return null;
try
{
BlockResult result = BlockStateParser.parseForBlock(HolderLookup.forRegistry(Registry.BLOCK), new StringReader(string), false);
return result.blockState();
}
catch (Exception e)
{
new InvalidConfigException("Blockstate parsing Exception at: " + string + " : " + e.getMessage()).printException();
return null;
}
}
@Nullable
public static Item getItem(String string)
{
if (string == null)
return null;
try
{
ItemResult res = ItemParser.parseForItem(HolderLookup.forRegistry(Registry.ITEM), new StringReader(string));
return res.item().get();
}
catch (Exception e)
{
new InvalidConfigException("Item parsing Exception at: " + string + " : " + e.getMessage()).printException();
return null;
}
}
public static ItemStack getItemStack(String string)
{
if (string == null)
return null;
try
{
ItemResult res = ItemParser.parseForItem(HolderLookup.forRegistry(Registry.ITEM), new StringReader(string));
Item item = res.item().get();
CompoundTag nbt = res.nbt();
ItemStack stack = new ItemStack(item, 1);
if (nbt != null)
{
stack.setTag(nbt);
}
return stack;
}
catch (Exception e)
{
new InvalidConfigException("Item parsing Exception at: " + string + " : " + e.getMessage()).printException();
return ItemStack.EMPTY;
}
}
@Nullable
public static CompoundTag getTagCompound(String string)
{
CompoundTag tag = null;
if (string == null)
return null;
if (string.contains("{"))
{
if (!string.contains("}"))
new InvalidConfigException("Missing } at : " + string).printException();
String nbt = string.substring(string.indexOf("{"));
string = string.replace(nbt, "");
try
{
tag = TagParser.parseTag(nbt);
}
catch (Exception e)
{
new InvalidConfigException("Error while parsing NBT: " + e.getMessage()).printException();
return null;
}
}
else if (string.contains("}"))
new InvalidConfigException("Missing { at : " + string).printException();
return tag;
}
}

View File

@ -1,389 +0,0 @@
package tschipp.carryon.common.item;
import java.util.Set;
import javax.annotation.Nullable;
import com.google.common.base.CharMatcher;
import net.minecraft.ChatFormatting;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.ClickEvent;
import net.minecraft.network.chat.ClickEvent.Action;
import net.minecraft.network.chat.Component;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.util.BlockSnapshot;
import net.minecraftforge.event.level.BlockEvent.EntityPlaceEvent;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.registries.ForgeRegistries;
import tschipp.carryon.CarryOn;
import tschipp.carryon.client.keybinds.CarryOnKeybinds;
import tschipp.carryon.common.config.Configs.Settings;
import tschipp.carryon.common.event.ItemEvents;
import tschipp.carryon.common.handler.CustomPickupOverrideHandler;
import tschipp.carryon.common.handler.ModelOverridesHandler;
public class ItemCarryonBlock extends Item
{
public static final String TILE_DATA_KEY = "tileData";
public static final String[] FACING_KEYS = { "rotation", "rot", "facing", "face", "direction", "dir", "front", "forward" };
public ItemCarryonBlock()
{
super(new Item.Properties().stacksTo(1));
}
@Override
public Component getName(ItemStack stack)
{
if (hasTileData(stack))
{
BlockState state = getBlockState(stack);
CompoundTag nbt = getTileData(stack);
if (ModelOverridesHandler.hasCustomOverrideModel(state, nbt))
{
Object override = ModelOverridesHandler.getOverrideObject(state, nbt);
if (override instanceof ItemStack)
return ((ItemStack) override).getHoverName();
else
{
BlockState ostate = (BlockState) override;
return ostate.getBlock().getName();
}
}
return getItemStack(stack).getHoverName();
}
return Component.literal("");
}
@Override
public InteractionResult useOn(UseOnContext context)
{
Direction facing = context.getClickedFace();
Player player = context.getPlayer();
Level level = context.getLevel();
BlockPos pos = context.getClickedPos();
ItemStack stack = context.getItemInHand();
if (ModList.get().isLoaded("betterplacement") && CarryOnKeybinds.isKeyPressed(player))
return InteractionResult.FAIL;
if (hasTileData(stack))
{
try
{
Vec3 vec = player.getLookAngle();
Direction facing2 = Direction.getNearest((float) vec.x, 0f, (float) vec.z);
BlockPos pos2 = pos;
Block containedblock = getBlock(stack);
BlockState containedstate = getBlockState(stack);
if (!level.getBlockState(pos2).canBeReplaced(new BlockPlaceContext(context)))
{
pos2 = pos.relative(facing);
}
if (level.getBlockState(pos2).canBeReplaced(new BlockPlaceContext(context)) && containedblock != null)
{
boolean canPlace = containedstate.canSurvive(level, pos2);
if (canPlace && player.mayUseItemAt(pos, facing, stack) && level.mayInteract(player, pos2))
{
BlockState placementState = containedblock.getStateForPlacement(new BlockPlaceContext(context));
BlockState actualState = placementState == null ? containedstate : placementState;
// Attempted fix for #287
// for (IProperty<?> prop :
// placementState.getValues().keySet())
// {
// if (prop instanceof DirectionProperty)
// actualState = actualState.with((DirectionProperty)
// prop, placementState.get((DirectionProperty) prop));
// else if (prop == BlockStateProperties.WATERLOGGED)
// actualState = actualState.with((BooleanProperty)
// prop, placementState.get((BooleanProperty) prop));
// else if(prop instanceof EnumProperty<?>)
// {
// Object value = placementState.get(prop);
// if(value instanceof Direction.Axis)
// {
// actualState = actualState.with((EnumProperty)prop,
// (Direction.Axis)value);
// }
// }
// }
BlockSnapshot snapshot = BlockSnapshot.create(level.dimension(), level, pos2);
EntityPlaceEvent event = new EntityPlaceEvent(snapshot, level.getBlockState(pos), player);
MinecraftForge.EVENT_BUS.post(event);
if (!event.isCanceled())
{
level.setBlockAndUpdate(pos2, actualState);
// If the blockstate doesn't handle rotation,
// try to
// change rotation via NBT
if (!getTileData(stack).isEmpty())
{
CompoundTag tag = getTileData(stack);
Set<String> keys = tag.getAllKeys();
keytester: for (String key : keys)
{
for (String facingKey : FACING_KEYS)
{
if (key.toLowerCase().equals(facingKey))
{
byte type = tag.getTagType(key);
switch (type)
{
case 8:
tag.putString(key, CharMatcher.javaUpperCase().matchesAllOf(tag.getString(key)) ? facing2.getOpposite().getName().toUpperCase() : facing2.getOpposite().getName());
break;
case 3:
tag.putInt(key, facing2.getOpposite().get3DDataValue());
break;
case 1:
tag.putByte(key, (byte) facing2.getOpposite().get3DDataValue());
break;
default:
break;
}
break keytester;
}
}
}
}
BlockEntity tile = level.getBlockEntity(pos2);
if (tile != null)
{
CompoundTag data = getTileData(stack);
updateTileLocation(data, pos2);
tile.load(data);
}
clearTileData(stack);
player.playSound(actualState.getSoundType(level, pos2, player).getPlaceSound(), 1.0f, 0.5f);
player.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY);
player.getPersistentData().remove("overrideKey");
ItemEvents.sendPacket(player, 9, 0);
return InteractionResult.SUCCESS;
}
}
}
}
catch (Exception e)
{
e.printStackTrace();
if (level != null && level.isClientSide)
{
CarryOn.LOGGER.info("Block: " + ItemCarryonBlock.getBlock(stack));
CarryOn.LOGGER.info("BlockState: " + ItemCarryonBlock.getBlockState(stack));
// CarryOn.LOGGER.info("Meta: " + itemTile.get().getMeta(stack));
CarryOn.LOGGER.info("ItemStack: " + ItemCarryonBlock.getItemStack(stack));
if (ModelOverridesHandler.hasCustomOverrideModel(ItemCarryonBlock.getBlockState(stack), ItemCarryonBlock.getTileData(stack)))
CarryOn.LOGGER.info("Override Model: " + ModelOverridesHandler.getOverrideObject(ItemCarryonBlock.getBlockState(stack), ItemCarryonBlock.getTileData(stack)));
if (CustomPickupOverrideHandler.hasSpecialPickupConditions(ItemCarryonBlock.getBlockState(stack)))
CarryOn.LOGGER.info("Custom Pickup Condition: " + CustomPickupOverrideHandler.getPickupCondition(ItemCarryonBlock.getBlockState(stack)));
player.displayClientMessage(Component.literal(ChatFormatting.RED + "Error detected. Cannot place block. Execute \"/carryon clear\" to remove the item"), false);
Component s = Component.literal(ChatFormatting.GOLD + "here");
s.getStyle().withClickEvent(new ClickEvent(Action.OPEN_URL, "https://github.com/Tschipp/CarryOn/issues"));
player.displayClientMessage(Component.literal(ChatFormatting.RED + "Please report this error ").append(s), false);
}
}
}
return InteractionResult.FAIL;
}
@Override
public void inventoryTick(ItemStack stack, Level level, Entity entity, int itemSlot, boolean isSelected)
{
if (hasTileData(stack))
{
if (entity instanceof LivingEntity)
{
if (entity instanceof Player && Settings.slownessInCreative.get() ? false : ((Player) entity).isCreative())
return;
((LivingEntity) entity).addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 1, potionLevel(stack), false, false));
}
}
else
{
stack = ItemStack.EMPTY;
}
}
public static boolean hasTileData(ItemStack stack)
{
if (stack.hasTag())
{
CompoundTag tag = stack.getTag();
return tag.contains(TILE_DATA_KEY) && tag.contains("block") && tag.contains("stateid");
}
return false;
}
public static boolean storeTileData(@Nullable BlockEntity tile, Level level, BlockPos pos, BlockState state, ItemStack stack)
{
if (stack.isEmpty())
return false;
CompoundTag tileTag = new CompoundTag();
if (tile != null)
tileTag = tile.saveWithId();
CompoundTag tag = stack.hasTag() ? stack.getTag() : new CompoundTag();
if (tag.contains(TILE_DATA_KEY))
return false;
tag.put(TILE_DATA_KEY, tileTag);
// ItemStack drop = new ItemStack(state.getBlock().getItemDropped(state,
// itemRand, 0), 1, state.getBlock().damageDropped(state));
tag.putString("block", ForgeRegistries.BLOCKS.getKey(state.getBlock()).toString());
// Item item = Item.getItemFromBlock(state.getBlock());
// tag.setInt("meta", drop.getItemDamage());
tag.putInt("stateid", Block.getId(state));
stack.setTag(tag);
return true;
}
public static void updateTileLocation(CompoundTag tag, BlockPos pos)
{
tag.putInt("x", pos.getX());
tag.putInt("y", pos.getY());
tag.putInt("z", pos.getZ());
}
public static void clearTileData(ItemStack stack)
{
if (stack.hasTag())
{
CompoundTag tag = stack.getTag();
tag.remove(TILE_DATA_KEY);
tag.remove("block");
tag.remove("stateid");
}
}
public static CompoundTag getTileData(ItemStack stack)
{
if (stack.hasTag())
{
CompoundTag tag = stack.getTag();
return tag.getCompound(TILE_DATA_KEY);
}
return null;
}
public static Block getBlock(ItemStack stack)
{
if (stack.hasTag())
{
CompoundTag tag = stack.getTag();
int id = tag.getInt("stateid");
return Block.stateById(id).getBlock();
}
return Blocks.AIR;
}
// public static int getMeta(ItemStack stack)
// {
// if (stack.hasTag())
// {
// CompoundTag tag = stack.getTag();
// int meta = tag.getInt("meta");
// return meta;
// }
// return 0;
// }
public static ItemStack getItemStack(ItemStack stack)
{
return new ItemStack(getBlock(stack), 1);
}
public static BlockState getBlockState(ItemStack stack)
{
if (stack.hasTag())
{
CompoundTag tag = stack.getTag();
int id = tag.getInt("stateid");
return Block.stateById(id);
}
return Blocks.AIR.defaultBlockState();
}
public static boolean isLocked(BlockPos pos, Level level)
{
BlockEntity te = level.getBlockEntity(pos);
if (te != null)
{
CompoundTag tag = new CompoundTag();
te.saveWithId();
return tag.contains("Lock") ? !tag.getString("Lock").equals("") : false;
}
return false;
}
// private boolean equal(Object[] a, Object[] b)
// {
// if (a.length != b.length)
// return false;
//
// List lA = Arrays.asList(a);
// List lB = Arrays.asList(b);
//
// return lA.containsAll(lB);
// }
private int potionLevel(ItemStack stack)
{
String nbt = getTileData(stack).toString();
int i = nbt.length() / 500;
if (i > 4)
i = 4;
if (!Settings.heavyTiles.get())
i = 1;
return (int) (i * Settings.blockSlownessMultiplier.get());
}
}

View File

@ -1,280 +0,0 @@
package tschipp.carryon.common.item;
import java.lang.reflect.Method;
import java.util.Optional;
import javax.annotation.Nonnull;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.Mob;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
import tschipp.carryon.client.keybinds.CarryOnKeybinds;
import tschipp.carryon.common.config.Configs.Settings;
import tschipp.carryon.common.event.ItemEvents;
public class ItemCarryonEntity extends Item
{
private static final Method initGoals;
static
{
initGoals = ObfuscationReflectionHelper.findMethod(Mob.class, "m_8099_");
initGoals.setAccessible(true);
}
public static final String ENTITY_DATA_KEY = "entityData";
public ItemCarryonEntity()
{
super(new Item.Properties().stacksTo(1));
}
@Override
public Component getName(ItemStack stack)
{
if (hasEntityData(stack))
{
return Component.translatable(getEntityType(stack).getDescriptionId());
}
return Component.literal("");
}
public static boolean hasEntityData(ItemStack stack)
{
if (stack.hasTag())
{
CompoundTag tag = stack.getTag();
return tag.contains(ENTITY_DATA_KEY) && tag.contains("entity");
}
return false;
}
public static boolean storeEntityData(@Nonnull Entity entity, Level level, ItemStack stack)
{
if (entity == null || stack.isEmpty())
return false;
CompoundTag entityData = new CompoundTag();
entity.saveWithoutId(entityData);
String name = EntityType.getKey(entity.getType()).toString();
CompoundTag tag = stack.hasTag() ? stack.getTag() : new CompoundTag();
if (tag.contains(ENTITY_DATA_KEY))
return false;
tag.put(ENTITY_DATA_KEY, entityData);
tag.putString("entity", name);
stack.setTag(tag);
return true;
}
@Override
public InteractionResult useOn(UseOnContext context)
{
Player player = context.getPlayer();
Level level = context.getLevel();
BlockPos pos = context.getClickedPos();
Direction facing = context.getClickedFace();
ItemStack stack = context.getItemInHand();
BlockState state = level.getBlockState(pos);
if (ModList.get().isLoaded("betterplacement") && CarryOnKeybinds.isKeyPressed(player))
return InteractionResult.FAIL;
if (hasEntityData(stack))
{
BlockPos finalPos = pos;
if (!state.canBeReplaced(new BlockPlaceContext(context)))
{
finalPos = pos.relative(facing);
}
Entity entity = getEntity(stack, level);
if (entity != null)
{
if (!level.isClientSide)
{
entity.absMoveTo(finalPos.getX() + 0.5, finalPos.getY(), finalPos.getZ() + 0.5, 180 + player.yHeadRot, 0.0f);
level.addFreshEntity(entity);
if (entity instanceof Mob)
{
((Mob) entity).playAmbientSound();
}
clearEntityData(stack);
player.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY);
ItemEvents.sendPacket(player, 9, 0);
}
player.getPersistentData().remove("overrideKey");
return InteractionResult.SUCCESS;
}
}
return InteractionResult.FAIL;
}
@Override
public void inventoryTick(ItemStack stack, Level level, Entity entity, int itemSlot, boolean isSelected)
{
if (hasEntityData(stack))
{
if (getEntity(stack, level) == null)
stack = ItemStack.EMPTY;
if (entity instanceof LivingEntity)
{
if (entity instanceof Player && Settings.slownessInCreative.get() ? false : ((Player) entity).isCreative())
return;
((LivingEntity) entity).addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 1, this.potionLevel(stack, level), false, false));
}
}
else
{
stack = ItemStack.EMPTY;
}
}
public static void clearEntityData(ItemStack stack)
{
if (stack.hasTag())
{
CompoundTag tag = stack.getTag();
tag.remove(ENTITY_DATA_KEY);
tag.remove("entity");
}
}
public static CompoundTag getPersistentData(ItemStack stack)
{
if (stack.hasTag())
{
CompoundTag tag = stack.getTag();
return tag.getCompound(ENTITY_DATA_KEY);
}
return null;
}
public static Entity getEntity(ItemStack stack, Level level)
{
if (level == null)
return null;
String name = getEntityName(stack);
CompoundTag e = getPersistentData(stack);
Optional<EntityType<?>> type = EntityType.byString(name);
Entity entity = null;
if (type.isPresent())
{
entity = type.get().create(level);
}
if (entity != null)
{
try
{
if (entity instanceof Mob)
initGoals.invoke(entity);
entity.deserializeNBT(e);
}
catch (Exception e1)
{
try
{
entity.deserializeNBT(e);
}
catch (Exception e2)
{
}
}
}
return entity;
}
public static String getEntityName(ItemStack stack)
{
if (stack.hasTag())
{
CompoundTag tag = stack.getTag();
return tag.getString("entity");
}
return null;
}
public static String getCustomName(ItemStack stack)
{
if (stack.hasTag())
{
CompoundTag tag = stack.getTag();
if (tag.contains("CustomName") && !tag.getString("CustomName").isEmpty())
{
return tag.toString();
}
else
{
return tag.toString();
}
}
return null;
}
public static EntityType<?> getEntityType(ItemStack stack)
{
if (stack.hasTag())
{
CompoundTag tag = stack.getTag();
String name = tag.getString("entity");
Optional<EntityType<?>> type = EntityType.byString(name);
if (type.isPresent())
return type.get();
}
return null;
}
private int potionLevel(ItemStack stack, Level level)
{
Entity e = getEntity(stack, level);
if (e == null)
return 1;
int i = (int) (e.getBbHeight() * e.getBbWidth());
if (i > 4)
i = 4;
if (!Settings.heavyEntities.get())
i = 1;
double multiplier = Settings.entitySlownessMultiplier.get();
return (int) (multiplier * i);
}
}

View File

@ -1,767 +0,0 @@
package tschipp.carryon.common.scripting;
import java.util.Objects;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.TagParser;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceLocation;
import tschipp.carryon.common.helper.InvalidConfigException;
public class CarryOnOverride
{
// BLOCKS
private CompoundTag typeBlockTag = new CompoundTag();
private String typeNameBlock = "";
private String typeMaterial = "";
private String typeHardness = "";
private String typeResistance = "";
// ENTITIES
private CompoundTag typeEntityTag;
private String typeNameEntity = "";
private String typeHeight = "";
private String typeWidth = "";
private String typeHealth = "";
// CONDITIONS
private String conditionGamestage = "";
private String conditionAchievement = "";
private String conditionXp = "";
private String conditionGamemode = "";
private String conditionScoreboard = "";
private String conditionPosition = "";
private String conditionEffects = "";
// RENDER
private String renderNameBlock = "";
private String renderNameEntity = "";
private CompoundTag renderNBT = new CompoundTag();
private String renderTranslation = "";
private String renderRotation = "";
private String renderscaled = "";
private String renderRotationLeftArm = "";
private String renderRotationRightArm = "";
private boolean renderLeftArm = true;
private boolean renderRightArm = true;
// EFFECTS
private String commandInit = "";
private String commandLoop = "";
private String commandPlace = "";
private boolean isBlock;
private boolean isEntity;
private String resourceLocation = "";
public boolean isInvalid = false;
public CarryOnOverride(String path)
{
this.resourceLocation = path;
}
public CarryOnOverride(JsonElement jsonElem, ResourceLocation loc)
{
boolean errored = false;
this.resourceLocation = loc.toString();
if (jsonElem != null && jsonElem.isJsonObject())
{
try
{
JsonObject json = jsonElem.getAsJsonObject();
JsonObject object = (JsonObject) json.get("object");
JsonObject conditions = (JsonObject) json.get("conditions");
JsonObject render = (JsonObject) json.get("render");
JsonObject effects = (JsonObject) json.get("effects");
if (object != null && (conditions != null || render != null || effects != null))
{
JsonObject block = (JsonObject) object.get("block");
JsonObject entity = (JsonObject) object.get("entity");
if (block == null && entity == null || block != null && entity != null)
errored = true;
if (!errored)
{
if (block != null)
{
this.setBlock(true);
JsonElement name = block.get("name");
JsonElement material = block.get("material");
JsonElement hardness = block.get("hardness");
JsonElement resistance = block.get("resistance");
JsonObject nbt = (JsonObject) block.get("nbt");
if (name != null)
this.setTypeNameBlock(name.getAsString());
if (material != null)
this.setTypeMaterial(material.getAsString());
if (hardness != null)
this.setTypeHardness(hardness.getAsString());
if (resistance != null)
this.setTypeResistance(resistance.getAsString());
if (nbt != null)
this.setTypeBlockTag(TagParser.parseTag(nbt.toString()));
}
else
{
this.setEntity(true);
JsonElement name = entity.get("name");
JsonElement health = entity.get("health");
JsonElement height = entity.get("height");
JsonElement width = entity.get("width");
JsonObject nbt = (JsonObject) entity.get("nbt");
if (name != null)
this.setTypeNameEntity(name.getAsString());
if (health != null)
this.setTypeHealth(health.getAsString());
if (height != null)
this.setTypeHeight(height.getAsString());
if (width != null)
this.setTypeWidth(width.getAsString());
if (nbt != null)
this.setTypeEntityTag(TagParser.parseTag(nbt.toString()));
}
if (conditions != null)
{
JsonElement gamestage = conditions.get("gamestage");
JsonElement achievement = conditions.get("advancement");
JsonElement xp = conditions.get("xp");
JsonElement gamemode = conditions.get("gamemode");
JsonElement scoreboard = conditions.get("scoreboard");
JsonElement position = conditions.get("position");
JsonElement potionEffects = conditions.get("effects");
if (gamestage != null)
this.setConditionGamestage(gamestage.getAsString());
if (achievement != null)
this.setConditionAchievement(achievement.getAsString());
if (xp != null)
this.setConditionXp(xp.getAsString());
if (gamemode != null)
this.setConditionGamemode(gamemode.getAsString());
if (scoreboard != null)
this.setConditionScoreboard(scoreboard.getAsString());
if (position != null)
this.setConditionPosition(position.getAsString());
if (potionEffects != null)
this.setConditionEffects(potionEffects.getAsString());
}
if (render != null)
{
JsonElement name_block = render.get("name_block");
JsonElement name_entity = render.get("name_entity");
JsonObject nbt = (JsonObject) render.get("nbt");
JsonElement translation = render.get("translation");
JsonElement rotation = render.get("rotation");
JsonElement scaled = render.get("scale");
JsonElement rotationLeftArm = render.get("rotation_left_arm");
JsonElement rotationRightArm = render.get("rotation_right_arm");
JsonElement renderLeftArm = render.get("render_left_arm");
JsonElement renderRightArm = render.get("render_right_arm");
if (name_block != null)
this.setRenderNameBlock(name_block.getAsString());
if (name_entity != null)
this.setRenderNameEntity(name_entity.getAsString());
if (translation != null)
this.setRenderTranslation(translation.getAsString());
if (rotation != null)
this.setRenderRotation(rotation.getAsString());
if (scaled != null)
this.setRenderscaled(scaled.getAsString());
if (nbt != null)
this.setRenderNBT(TagParser.parseTag(nbt.toString()));
if (rotationLeftArm != null)
this.setRenderRotationLeftArm(rotationLeftArm.getAsString());
if (rotationRightArm != null)
this.setRenderRotationRightArm(rotationRightArm.getAsString());
if (renderLeftArm != null)
this.setRenderLeftArm(renderLeftArm.getAsBoolean());
if (renderRightArm != null)
this.setRenderRightArm(renderRightArm.getAsBoolean());
}
if (effects != null)
{
JsonElement commandInit = effects.get("commandPickup");
JsonElement commandLoop = effects.get("commandLoop");
JsonElement commandPlace = effects.get("commandPlace");
if (commandInit != null)
this.setCommandInit(commandInit.getAsString());
if (commandLoop != null)
this.setCommandLoop(commandLoop.getAsString());
if (commandPlace != null)
this.setCommandPlace(commandPlace.getAsString());
}
}
else
this.isInvalid = true;
}
}
catch (Exception e)
{
this.isInvalid = true;
}
}
else
this.isInvalid = true;
if (!this.isBlock && !this.isEntity)
this.isInvalid = true;
if (this.isInvalid)
new InvalidConfigException("The script parsing for " + this.resourceLocation + " has failed! Please double check!").printException();
}
public String getCommandInit()
{
return this.commandInit;
}
public void setCommandInit(String commandInit)
{
this.commandInit = commandInit;
}
public String getCommandLoop()
{
return this.commandLoop;
}
public void setCommandLoop(String commandLoop)
{
this.commandLoop = commandLoop;
}
public String getConditionEffects()
{
return this.conditionEffects;
}
public void setConditionEffects(String conditionEffects)
{
this.conditionEffects = conditionEffects;
}
public String getRenderRotationLeftArm()
{
return this.renderRotationLeftArm;
}
public void setRenderRotationLeftArm(String renderRotationLeftArm)
{
this.renderRotationLeftArm = renderRotationLeftArm;
}
public String getRenderRotationRightArm()
{
return this.renderRotationRightArm;
}
public void setRenderRotationRightArm(String renderRotationRightArm)
{
this.renderRotationRightArm = renderRotationRightArm;
}
public boolean isRenderLeftArm()
{
return this.renderLeftArm;
}
public void setRenderLeftArm(boolean renderLeftArm)
{
this.renderLeftArm = renderLeftArm;
}
public boolean isRenderRightArm()
{
return this.renderRightArm;
}
public void setRenderRightArm(boolean renderRightArm)
{
this.renderRightArm = renderRightArm;
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
return prime * result + (this.resourceLocation == null ? 0 : this.resourceLocation.hashCode());
}
@Override
public String toString()
{
return "Code: " + this.hashCode();
}
@Override
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null || this.getClass() != obj.getClass())
return false;
CarryOnOverride other = (CarryOnOverride) obj;
if (!Objects.equals(this.commandInit, other.commandInit) || !Objects.equals(this.commandLoop, other.commandLoop) || !Objects.equals(this.commandPlace, other.commandPlace) || !Objects.equals(this.conditionAchievement, other.conditionAchievement))
{
return false;
}
if (!Objects.equals(this.conditionEffects, other.conditionEffects) || !Objects.equals(this.conditionGamemode, other.conditionGamemode) || !Objects.equals(this.conditionGamestage, other.conditionGamestage) || !Objects.equals(this.conditionPosition, other.conditionPosition))
{
return false;
}
if (!Objects.equals(this.conditionScoreboard, other.conditionScoreboard))
{
return false;
}
if (!Objects.equals(this.conditionXp, other.conditionXp))
{
return false;
}
if (this.isBlock != other.isBlock)
return false;
if (this.isEntity != other.isEntity)
return false;
if (!Objects.equals(this.resourceLocation, other.resourceLocation))
{
return false;
}
if (this.renderLeftArm != other.renderLeftArm)
return false;
if (!Objects.equals(this.renderNBT, other.renderNBT))
{
return false;
}
if (!Objects.equals(this.renderNameBlock, other.renderNameBlock))
{
return false;
}
if (!Objects.equals(this.renderNameEntity, other.renderNameEntity))
{
return false;
}
if (this.renderRightArm != other.renderRightArm)
return false;
if (!Objects.equals(this.renderRotation, other.renderRotation))
{
return false;
}
if (!Objects.equals(this.renderRotationLeftArm, other.renderRotationLeftArm))
{
return false;
}
if (!Objects.equals(this.renderRotationRightArm, other.renderRotationRightArm))
{
return false;
}
if (!Objects.equals(this.renderscaled, other.renderscaled))
{
return false;
}
if (!Objects.equals(this.renderTranslation, other.renderTranslation))
{
return false;
}
if (!Objects.equals(this.typeBlockTag, other.typeBlockTag))
{
return false;
}
if (!Objects.equals(this.typeEntityTag, other.typeEntityTag))
{
return false;
}
if (!Objects.equals(this.typeHardness, other.typeHardness))
{
return false;
}
if (!Objects.equals(this.typeHealth, other.typeHealth))
{
return false;
}
if (!Objects.equals(this.typeHeight, other.typeHeight))
{
return false;
}
if (!Objects.equals(this.typeMaterial, other.typeMaterial))
{
return false;
}
if (!Objects.equals(this.typeNameBlock, other.typeNameBlock))
{
return false;
}
if (!Objects.equals(this.typeNameEntity, other.typeNameEntity))
{
return false;
}
if (!Objects.equals(this.typeResistance, other.typeResistance))
{
return false;
}
if (!Objects.equals(this.typeWidth, other.typeWidth))
{
return false;
}
return true;
}
public boolean isBlock()
{
return this.isBlock;
}
public void setBlock(boolean isBlock)
{
this.isBlock = isBlock;
}
public boolean isEntity()
{
return this.isEntity;
}
public void setEntity(boolean isEntity)
{
this.isEntity = isEntity;
}
public CompoundTag getTypeBlockTag()
{
return this.typeBlockTag;
}
public String getTypeNameBlock()
{
return this.typeNameBlock;
}
public String getTypeMaterial()
{
return this.typeMaterial;
}
public String getTypeHardness()
{
return this.typeHardness;
}
public String getTypeResistance()
{
return this.typeResistance;
}
public CompoundTag getTypeEntityTag()
{
return this.typeEntityTag;
}
public String getTypeNameEntity()
{
return this.typeNameEntity;
}
public String getTypeHeight()
{
return this.typeHeight;
}
public String getTypeWidth()
{
return this.typeWidth;
}
public String getTypeHealth()
{
return this.typeHealth;
}
public String getConditionGamestage()
{
return this.conditionGamestage;
}
public String getConditionAchievement()
{
return this.conditionAchievement;
}
public String getConditionXp()
{
return this.conditionXp;
}
public String getConditionGamemode()
{
return this.conditionGamemode;
}
public String getConditionScoreboard()
{
return this.conditionScoreboard;
}
public String getConditionPosition()
{
return this.conditionPosition;
}
public String getRenderNameBlock()
{
return this.renderNameBlock;
}
public String getRenderNameEntity()
{
return this.renderNameEntity;
}
public CompoundTag getRenderNBT()
{
return this.renderNBT;
}
public String getRenderTranslation()
{
return this.renderTranslation;
}
public String getRenderRotation()
{
return this.renderRotation;
}
public String getRenderScaled()
{
return this.renderscaled;
}
public void setTypeBlockTag(CompoundTag typeBlockTag)
{
this.typeBlockTag = typeBlockTag;
}
public void setTypeNameBlock(String typeNameBlock)
{
this.typeNameBlock = typeNameBlock;
}
public void setTypeMaterial(String typeMaterial)
{
this.typeMaterial = typeMaterial;
}
public void setTypeHardness(String typeHardness)
{
this.typeHardness = typeHardness;
}
public void setTypeResistance(String typeResistance)
{
this.typeResistance = typeResistance;
}
public void setTypeEntityTag(CompoundTag typeEntityTag)
{
this.typeEntityTag = typeEntityTag;
}
public void setTypeNameEntity(String typeNameEntity)
{
this.typeNameEntity = typeNameEntity;
}
public void setTypeHeight(String typeHeight)
{
this.typeHeight = typeHeight;
}
public void setTypeWidth(String typeWidth)
{
this.typeWidth = typeWidth;
}
public void setTypeHealth(String typeHealth)
{
this.typeHealth = typeHealth;
}
public void setConditionGamestage(String conditionGamestage)
{
this.conditionGamestage = conditionGamestage;
}
public void setConditionAchievement(String conditionAchievement)
{
this.conditionAchievement = conditionAchievement;
}
public void setConditionXp(String conditionXp)
{
this.conditionXp = conditionXp;
}
public void setConditionGamemode(String conditionGamemode)
{
this.conditionGamemode = conditionGamemode;
}
public void setConditionScoreboard(String conditionScoreboard)
{
this.conditionScoreboard = conditionScoreboard;
}
public void setConditionPosition(String conditionPosition)
{
this.conditionPosition = conditionPosition;
}
public void setRenderNameBlock(String renderNameBlock)
{
this.renderNameBlock = renderNameBlock;
}
public void setRenderNameEntity(String renderNameEntity)
{
this.renderNameEntity = renderNameEntity;
}
public void setRenderNBT(CompoundTag renderNBT)
{
this.renderNBT = renderNBT;
}
public void setRenderTranslation(String renderTranslation)
{
this.renderTranslation = renderTranslation;
}
public void setRenderRotation(String renderRotation)
{
this.renderRotation = renderRotation;
}
public void setRenderscaled(String renderscaled)
{
this.renderscaled = renderscaled;
}
public String getCommandPlace()
{
return this.commandPlace;
}
public void setCommandPlace(String commandPlace)
{
this.commandPlace = commandPlace;
}
public void serialize(FriendlyByteBuf buf)
{
// BLOCKS
buf.writeNbt(this.typeBlockTag);
buf.writeUtf(this.typeNameBlock);
buf.writeUtf(this.typeMaterial);
buf.writeUtf(this.typeHardness);
buf.writeUtf(this.typeResistance);
// ENTITIES
buf.writeNbt(this.typeEntityTag);
buf.writeUtf(this.typeNameEntity);
buf.writeUtf(this.typeHeight);
buf.writeUtf(this.typeWidth);
buf.writeUtf(this.typeHealth);
// CONDITIONS
buf.writeUtf(this.conditionGamestage);
buf.writeUtf(this.conditionAchievement);
buf.writeUtf(this.conditionXp);
buf.writeUtf(this.conditionGamemode);
buf.writeUtf(this.conditionScoreboard);
buf.writeUtf(this.conditionPosition);
buf.writeUtf(this.conditionEffects);
// RENDER
buf.writeUtf(this.renderNameBlock);
buf.writeUtf(this.renderNameEntity);
buf.writeNbt(this.renderNBT);
buf.writeUtf(this.renderTranslation);
buf.writeUtf(this.renderRotation);
buf.writeUtf(this.renderscaled);
buf.writeUtf(this.renderRotationLeftArm);
buf.writeUtf(this.renderRotationRightArm);
buf.writeBoolean(this.renderLeftArm);
buf.writeBoolean(this.renderRightArm);
// EFFECTS
buf.writeUtf(this.commandInit);
buf.writeUtf(this.commandLoop);
buf.writeUtf(this.commandPlace);
buf.writeBoolean(this.isBlock);
buf.writeBoolean(this.isEntity);
buf.writeUtf(this.resourceLocation);
}
public static CarryOnOverride deserialize(FriendlyByteBuf buf)
{
CarryOnOverride override = new CarryOnOverride("");
override.typeBlockTag = buf.readNbt();
override.typeNameBlock = buf.readUtf();
override.typeMaterial = buf.readUtf();
override.typeHardness = buf.readUtf();
override.typeResistance = buf.readUtf();
// ENTITIES
override.typeEntityTag = buf.readNbt();
override.typeNameEntity = buf.readUtf();
override.typeHeight = buf.readUtf();
override.typeWidth = buf.readUtf();
override.typeHealth = buf.readUtf();
// CONDITIONS
override.conditionGamestage = buf.readUtf();
override.conditionAchievement = buf.readUtf();
override.conditionXp = buf.readUtf();
override.conditionGamemode = buf.readUtf();
override.conditionScoreboard = buf.readUtf();
override.conditionPosition = buf.readUtf();
override.conditionEffects = buf.readUtf();
// RENDER
override.renderNameBlock = buf.readUtf();
override.renderNameEntity = buf.readUtf();
override.renderNBT = buf.readNbt();
override.renderTranslation = buf.readUtf();
override.renderRotation = buf.readUtf();
override.renderscaled = buf.readUtf();
override.renderRotationLeftArm = buf.readUtf();
override.renderRotationRightArm = buf.readUtf();
override.renderLeftArm = buf.readBoolean();
override.renderRightArm = buf.readBoolean();
// EFFECTS
override.commandInit = buf.readUtf();
override.commandLoop = buf.readUtf();
override.commandPlace = buf.readUtf();
override.isBlock = buf.readBoolean();
override.isEntity = buf.readBoolean();
override.resourceLocation = buf.readUtf();
return override;
}
}

View File

@ -1,179 +0,0 @@
package tschipp.carryon.common.scripting;
import java.lang.reflect.Method;
import javax.annotation.Nullable;
import net.minecraft.advancements.Advancement;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.ServerAdvancementManager;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.Material;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
import net.minecraftforge.registries.ForgeRegistries;
import tschipp.carryon.common.config.Configs.Settings;
import tschipp.carryon.common.handler.ListHandler;
import tschipp.carryon.common.helper.ScriptParseHelper;
public class ScriptChecker
{
@Nullable
public static CarryOnOverride inspectBlock(BlockState state, Level level, BlockPos pos, @Nullable CompoundTag tag)
{
if (!Settings.useScripts.get())
return null;
Block block = state.getBlock();
Material material = state.getMaterial();
float hardness = state.getDestroySpeed(level, pos);
@SuppressWarnings("deprecation")
float resistance = block.getExplosionResistance();
CompoundTag nbt = tag;
boolean isAllowed = Settings.useWhitelistBlocks.get() ? ListHandler.isAllowed(block) : !ListHandler.isForbidden(block);
if (isAllowed)
{
for (CarryOnOverride override : ScriptReader.OVERRIDES.values())
{
if (override.isBlock() && matchesAll(override, block, material, hardness, resistance, nbt))
return override;
}
}
return null;
}
@Nullable
public static CarryOnOverride inspectEntity(Entity entity)
{
if (!Settings.useScripts.get())
return null;
String name = ForgeRegistries.ENTITY_TYPES.getKey(entity.getType()).toString();
float height = entity.getBbHeight();
float width = entity.getBbWidth();
float health = entity instanceof LivingEntity ? ((LivingEntity) entity).getHealth() : 0.0f;
CompoundTag tag = entity.serializeNBT();
boolean isAllowed = Settings.useWhitelistEntities.get() ? ListHandler.isAllowed(entity) : !ListHandler.isForbidden(entity);
if (isAllowed)
{
for (CarryOnOverride override : ScriptReader.OVERRIDES.values())
{
if (override.isEntity() && matchesAll(override, name, height, width, health, tag))
return override;
}
}
return null;
}
public static boolean matchesAll(CarryOnOverride override, String name, float height, float width, float health, CompoundTag tag)
{
boolean matchname = override.getTypeNameEntity().isEmpty() ? true : name.equals(override.getTypeNameEntity());
boolean matchheight = ScriptParseHelper.matches(height, override.getTypeHeight());
boolean matchwidth = ScriptParseHelper.matches(width, override.getTypeWidth());
boolean matchhealth = ScriptParseHelper.matches(health, override.getTypeHealth());
boolean matchnbt = ScriptParseHelper.matches(tag, override.getTypeEntityTag());
return matchname && matchheight && matchwidth && matchhealth && matchnbt;
}
public static boolean matchesAll(CarryOnOverride override, Block block, Material material, float hardness, float resistance, CompoundTag nbt)
{
boolean matchnbt = ScriptParseHelper.matches(nbt, override.getTypeBlockTag());
boolean matchblock = ScriptParseHelper.matches(block, override.getTypeNameBlock());
boolean matchmaterial = ScriptParseHelper.matches(material, override.getTypeMaterial());
boolean matchhardness = ScriptParseHelper.matches(hardness, override.getTypeHardness());
boolean matchresistance = ScriptParseHelper.matches(resistance, override.getTypeResistance());
return matchnbt && matchblock && matchmaterial && matchhardness && matchresistance;
}
public static boolean fulfillsConditions(CarryOnOverride override, Player player)
{
ServerAdvancementManager manager = ((ServerPlayer) player).server.getAdvancements();
Advancement adv = manager.getAdvancement(new ResourceLocation(override.getConditionAchievement().isEmpty() ? "" : override.getConditionAchievement()));
boolean achievement = adv == null ? true : ((ServerPlayer) player).getAdvancements().getOrStartProgress(adv).isDone();
boolean gamemode = ScriptParseHelper.matches(((ServerPlayer) player).gameMode.getGameModeForPlayer().getId(), override.getConditionGamemode());
boolean gamestage = true;
if (ModList.get().isLoaded("gamestages") && !override.getConditionGamestage().isEmpty())
{
try
{
Class<?> gameStageHelper = Class.forName("net.darkhax.gamestages.GameStageHelper");
Class<?> iStageData = Class.forName("net.darkhax.gamestages.data.IStageData");
Method getPlayerData = ObfuscationReflectionHelper.findMethod(gameStageHelper, "getPlayerData", Player.class);
Method hasStage = ObfuscationReflectionHelper.findMethod(iStageData, "hasStage", String.class);
Object stageData = getPlayerData.invoke(null, player);
String condition = override.getConditionGamestage();
gamestage = (boolean) hasStage.invoke(stageData, condition);
}
catch (Exception e)
{
try
{
Class<?> playerDataHandler = Class.forName("net.darkhax.gamestages.capabilities.PlayerDataHandler");
Class<?> iStageData = Class.forName("net.darkhax.gamestages.capabilities.PlayerDataHandler$IStageData");
Method getStageData = ObfuscationReflectionHelper.findMethod(playerDataHandler, "getStageData", Player.class);
Method hasUnlockedStage = ObfuscationReflectionHelper.findMethod(iStageData, "hasUnlockedStage", String.class);
Object stageData = getStageData.invoke(null, player);
String condition = override.getConditionGamestage();
gamestage = (boolean) hasUnlockedStage.invoke(stageData, condition);
}
catch (Exception ex)
{
}
}
}
boolean position = ScriptParseHelper.matches(player.blockPosition(), override.getConditionPosition());
boolean xp = ScriptParseHelper.matches(player.experienceLevel, override.getConditionXp());
boolean scoreboard = ScriptParseHelper.matchesScore(player, override.getConditionScoreboard());
boolean effects = ScriptParseHelper.hasEffects(player, override.getConditionEffects());
return achievement && gamemode && gamestage && position && xp && scoreboard && effects;
}
@Nullable
public static CarryOnOverride getOverride(Player player)
{
CompoundTag tag = player.getPersistentData();
if (tag != null && tag.contains("overrideKey"))
{
int key = tag.getInt("overrideKey");
return ScriptReader.OVERRIDES.get(key);
}
return null;
}
public static void setCarryOnOverride(Player player, int i)
{
CompoundTag tag = player.getPersistentData();
if (tag != null)
tag.putInt("overrideKey", i);
}
}

View File

@ -1,191 +0,0 @@
package tschipp.carryon.common.scripting;
import java.util.HashMap;
public class ScriptReader
{
public static HashMap<Integer, CarryOnOverride> OVERRIDES = new HashMap<>();
// public static HashSet<CarryOnOverride> OVERRIDES = new
// HashSet<CarryOnOverride>();
// public static void preInit()
// {
// scripts.clear();
//
// CarryOn.CONFIGURATION_FILE = new
// File(FMLPaths.CONFIGDIR.get().toString(), "/carryon-scripts/");
//
// if (!CarryOn.CONFIGURATION_FILE.exists())
// CarryOn.CONFIGURATION_FILE.mkdir();
//
// for (File file : CarryOn.CONFIGURATION_FILE.listFiles())
// {
// if (file.getName().endsWith(".json"))
// scripts.add(file);
// }
//
// }
// public static void parseScripts()
// {
// OVERRIDES.clear();
//
// try
// {
// if (!Settings.useScripts.get())
// return;
//
// for (File file : scripts)
// {
// boolean errored = false;
// JsonParser parser = new JsonParser();
// JsonObject json = (JsonObject) parser.parse(new
// FileReader(file.getAbsolutePath()));
//
// JsonObject object = (JsonObject) json.get("object");
// JsonObject conditions = (JsonObject) json.get("conditions");
// JsonObject render = (JsonObject) json.get("render");
// JsonObject effects = (JsonObject) json.get("effects");
//
// if ((object != null && conditions != null) || (object != null && render
// != null) || (object != null && effects != null))
// {
// JsonObject block = (JsonObject) object.get("block");
// JsonObject entity = (JsonObject) object.get("entity");
//
// if ((block == null && entity == null) || (block != null && entity !=
// null))
// errored = true;
//
// if (!errored)
// {
// CarryOnOverride override = new CarryOnOverride(file.getAbsolutePath());
//
// if (block != null)
// {
// override.setBlock(true);
// JsonElement name = block.get("name");
// JsonElement material = block.get("material");
// JsonElement hardness = block.get("hardness");
// JsonElement resistance = block.get("resistance");
// JsonObject nbt = (JsonObject) block.get("nbt");
//
// if (name != null)
// override.setTypeNameBlock(name.getAsString());
// if (material != null)
// override.setTypeMaterial(material.getAsString());
// if (hardness != null)
// override.setTypeHardness(hardness.getAsString());
// if (resistance != null)
// override.setTypeResistance(resistance.getAsString());
// if (nbt != null)
// override.setTypeBlockTag(JsonToNBT.getTagFromJson(nbt.toString()));
// } else
// {
// override.setEntity(true);
// JsonElement name = entity.get("name");
// JsonElement health = entity.get("health");
// JsonElement height = entity.get("height");
// JsonElement width = entity.get("width");
// JsonObject nbt = (JsonObject) entity.get("nbt");
//
// if (name != null)
// override.setTypeNameEntity(name.getAsString());
// if (health != null)
// override.setTypeHealth(health.getAsString());
// if (height != null)
// override.setTypeHeight(height.getAsString());
// if (width != null)
// override.setTypeWidth(width.getAsString());
// if (nbt != null)
// override.setTypeEntityTag(JsonToNBT.getTagFromJson(nbt.toString()));
// }
//
// if (conditions != null)
// {
// JsonElement gamestage = conditions.get("gamestage");
// JsonElement achievement = conditions.get("advancement");
// JsonElement xp = conditions.get("xp");
// JsonElement gamemode = conditions.get("gamemode");
// JsonElement scoreboard = conditions.get("scoreboard");
// JsonElement position = conditions.get("position");
// JsonElement potionEffects = conditions.get("effects");
//
// if (gamestage != null)
// override.setConditionGamestage(gamestage.getAsString());
// if (achievement != null)
// override.setConditionAchievement(achievement.getAsString());
// if (xp != null)
// override.setConditionXp(xp.getAsString());
// if (gamemode != null)
// override.setConditionGamemode(gamemode.getAsString());
// if (scoreboard != null)
// override.setConditionScoreboard(scoreboard.getAsString());
// if (position != null)
// override.setConditionPosition(position.getAsString());
// if (potionEffects != null)
// override.setConditionEffects(potionEffects.getAsString());
// }
//
// if (render != null)
// {
// JsonElement name_block = render.get("name_block");
// JsonElement name_entity = render.get("name_entity");
// JsonObject nbt = (JsonObject) render.get("nbt");
// JsonElement translation = render.get("translation");
// JsonElement rotation = render.get("rotation");
// JsonElement scaled = render.get("scale");
// JsonElement rotationLeftArm = render.get("rotation_left_arm");
// JsonElement rotationRightArm = render.get("rotation_right_arm");
// JsonElement renderLeftArm = render.get("render_left_arm");
// JsonElement renderRightArm = render.get("render_right_arm");
//
// if (name_block != null)
// override.setRenderNameBlock(name_block.getAsString());
// if (name_entity != null)
// override.setRenderNameEntity(name_entity.getAsString());
// if (translation != null)
// override.setRenderTranslation(translation.getAsString());
// if (rotation != null)
// override.setRenderRotation(rotation.getAsString());
// if (scaled != null)
// override.setRenderscaled(scaled.getAsString());
// if (nbt != null)
// override.setRenderNBT(JsonToNBT.getTagFromJson(nbt.toString()));
// if (rotationLeftArm != null)
// override.setRenderRotationLeftArm(rotationLeftArm.getAsString());
// if (rotationRightArm != null)
// override.setRenderRotationRightArm(rotationRightArm.getAsString());
// if (renderLeftArm != null)
// override.setRenderLeftArm(renderLeftArm.getAsBoolean());
// if (renderRightArm != null)
// override.setRenderRightArm(renderRightArm.getAsBoolean());
// }
//
// if (effects != null)
// {
// JsonElement commandInit = effects.get("commandPickup");
// JsonElement commandLoop = effects.get("commandLoop");
// JsonElement commandPlace = effects.get("commandPlace");
//
// if (commandInit != null)
// override.setCommandInit(commandInit.getAsString());
// if (commandLoop != null)
// override.setCommandLoop(commandLoop.getAsString());
// if (commandPlace != null)
// override.setCommandPlace(commandPlace.getAsString());
// }
//
// OVERRIDES.put(override.hashCode(), override);
// }
// }
// }
//
// System.out.println("Successfully parsed scripts!");
// } catch (Exception e)
// {
// CarryOn.LOGGER.error(e);
// }
// }
}

View File

@ -1,55 +0,0 @@
package tschipp.carryon.common.scripting;
import java.util.Map;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener;
import net.minecraft.util.profiling.ProfilerFiller;
import net.minecraftforge.event.AddReloadListenerEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus;
import net.minecraftforge.fml.util.thread.EffectiveSide;
import net.minecraftforge.network.PacketDistributor;
import net.minecraftforge.server.ServerLifecycleHooks;
import tschipp.carryon.CarryOn;
import tschipp.carryon.network.client.ScriptReloadPacket;
@EventBusSubscriber(modid = CarryOn.MODID, bus = Bus.FORGE)
public class ScriptReloadListener extends SimpleJsonResourceReloadListener
{
private static final Gson GSON = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create();
public ScriptReloadListener()
{
super(GSON, "carryon/scripts");
}
@Override
protected void apply(Map<ResourceLocation, JsonElement> objects, ResourceManager manager, ProfilerFiller profiler)
{
ScriptReader.OVERRIDES.clear();
objects.forEach((path, jsonElem) -> {
CarryOnOverride override = new CarryOnOverride(jsonElem, path);
if (!override.isInvalid)
ScriptReader.OVERRIDES.put(override.hashCode(), override);
});
if (EffectiveSide.get().isServer() && ServerLifecycleHooks.getCurrentServer() != null)
{
CarryOn.network.send(PacketDistributor.ALL.noArg(), new ScriptReloadPacket(ScriptReader.OVERRIDES.values()));
}
}
@SubscribeEvent
public static void onDatapackRegister(AddReloadListenerEvent event)
{
event.addListener(new ScriptReloadListener());
}
}

View File

@ -1,125 +0,0 @@
// package tschipp.carryon.compat.obfuscate;
//
// import com.mrcrayfish.obfuscate.client.event.PlayerModelEvent;
//
// import net.minecraft.client.model.PlayerModel;
// import net.minecraft.client.renderer.model.ModelRenderer;
// import net.minecraft.entity.player.PlayerEntity;
// import net.minecraft.world.item.ItemStack;
// import net.minecraftforge.api.distmarker.Dist;
// import net.minecraftforge.api.distmarker.OnlyIn;
// import net.minecraftforge.eventbus.api.SubscribeEvent;
// import tschipp.carryon.common.config.Configs.Settings;
// import tschipp.carryon.common.handler.RegistrationHandler;
// import tschipp.carryon.common.helper.ScriptParseHelper;
// import tschipp.carryon.common.item.ItemCarryonBlock;
// import tschipp.carryon.common.item.ItemCarryonEntity;
// import tschipp.carryon.common.scripting.CarryOnOverride;
// import tschipp.carryon.common.scripting.ScriptChecker;
//
// public class ObfuscateEvents
// {
//
// @SubscribeEvent
// public void preModelPlayerEvent(PlayerModelEvent.SetupAngles.Post event)
// {
// if(!Settings.renderArms.get())
// return;
//
// PlayerEntity player = event.getPlayer();
//
// Pose pose = player.getPose();
// if (pose == Pose.SWIMMING || pose == Pose.FALL_FLYING)
// return;
//
// PlayerModel<?> model = event.getModelPlayer();
// ItemStack stack = player.getMainHandItem();
// if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile.get() &&
// ItemCarryonBlock.hasTileData(stack) || stack.getItem() ==
// RegistrationHandler.itemEntity.get() && ItemCarryonEntity.hasEntityData(stack))
// {
//
// float rotation = 0;
//
// CarryOnOverride overrider = ScriptChecker.getOverride(player);
// if (overrider != null)
// {
// float[] rotLeft = null;
// float[] rotRight = null;
// if (overrider.getRenderRotationLeftArm() != null)
// rotLeft =
// ScriptParseHelper.getXYZArray(overrider.getRenderRotationLeftArm());
// if (overrider.getRenderRotationRightArm() != null)
// rotRight =
// ScriptParseHelper.getXYZArray(overrider.getRenderRotationRightArm());
//
// boolean renderRight = overrider.isRenderRightArm();
// boolean renderLeft = overrider.isRenderLeftArm();
//
// if (renderLeft && rotLeft != null)
// {
// renderArmPre(model.leftArm, (float) rotLeft[0], (float) rotLeft[2],
// rotation);
// renderArmPre(model.leftSleeve, (float) rotLeft[0], (float) rotLeft[2],
// rotation);
// }
// else if (renderLeft)
// {
// renderArmPre(model.leftArm, 0.8F + (player.isShiftKeyDown() ? 0.2f : 0f) -
// (stack.getItem() == RegistrationHandler.itemEntity.get() ? -0.2f : 0),
// (stack.getItem() == RegistrationHandler.itemEntity.get() ? 0.15f : 0), rotation);
// renderArmPre(model.leftSleeve, 0.8F + (player.isShiftKeyDown() ? 0.2f : 0f) -
// (stack.getItem() == RegistrationHandler.itemEntity.get() ? -0.2f : 0),
// (stack.getItem() == RegistrationHandler.itemEntity.get() ? 0.15f : 0), rotation);
// }
//
// if (renderRight && rotRight != null)
// {
// renderArmPre(model.rightArm, (float) rotRight[0], (float) rotRight[2],
// rotation);
// renderArmPre(model.rightSleeve, (float) rotRight[0], (float) rotRight[2],
// rotation);
// }
// else if (renderRight)
// {
// renderArmPre(model.rightArm, 0.8F + (player.isShiftKeyDown() ? 0.2f : 0f) -
// (stack.getItem() == RegistrationHandler.itemEntity.get() ? -0.2f : 0),
// (stack.getItem() == RegistrationHandler.itemEntity.get() ? -0.15f : 0), rotation);
// renderArmPre(model.rightSleeve, 0.8F + (player.isShiftKeyDown() ? 0.2f : 0f)
// - (stack.getItem() == RegistrationHandler.itemEntity.get() ? -0.2f : 0),
// (stack.getItem() == RegistrationHandler.itemEntity.get() ? -0.15f : 0), rotation);
// }
//
// }
// else
// {
// renderArmPre(model.rightArm, 0.8F + (player.isShiftKeyDown() ? 0.2f : 0f) -
// (stack.getItem() == RegistrationHandler.itemEntity.get() ? -0.2f : 0),
// (stack.getItem() == RegistrationHandler.itemEntity.get() ? -0.15f : 0), rotation);
// renderArmPre(model.rightSleeve, 0.8F + (player.isShiftKeyDown() ? 0.2f : 0f)
// - (stack.getItem() == RegistrationHandler.itemEntity.get() ? -0.2f : 0),
// (stack.getItem() == RegistrationHandler.itemEntity.get() ? -0.15f : 0), rotation);
// renderArmPre(model.leftArm, 0.8F + (player.isShiftKeyDown() ? 0.2f : 0f) -
// (stack.getItem() == RegistrationHandler.itemEntity.get() ? -0.2f : 0),
// (stack.getItem() == RegistrationHandler.itemEntity.get() ? 0.15f : 0), rotation);
// renderArmPre(model.leftSleeve, 0.8F + (player.isShiftKeyDown() ? 0.2f : 0f) -
// (stack.getItem() == RegistrationHandler.itemEntity.get() ? -0.2f : 0),
// (stack.getItem() == RegistrationHandler.itemEntity.get() ? 0.15f : 0), rotation);
// }
//
// }
//
// }
//
//
// @OnlyIn(Dist.CLIENT)
// private void renderArmPre(ModelRenderer arm, float x, float z, float
// rotation)
// {
// arm.xRot = (float) -x;
// arm.yRot = (float) -Math.toRadians(rotation);
// arm.zRot = (float) z;
// }
//
//
// }

View File

@ -1,86 +0,0 @@
package tschipp.carryon.network.client;
import java.util.function.Supplier;
import io.netty.buffer.ByteBuf;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraftforge.network.NetworkEvent;
import tschipp.carryon.CarryOn;
import tschipp.carryon.common.scripting.ScriptChecker;
public class CarrySlotPacket
{
public int slot;
public int carryOverride = 0;
public int entityid;
public CarrySlotPacket(ByteBuf buf)
{
this.slot = buf.readInt();
this.carryOverride = buf.readInt();
this.entityid = buf.readInt();
}
public CarrySlotPacket(int slot, int entityid)
{
this.slot = slot;
this.entityid = entityid;
}
public CarrySlotPacket(int slot, int entityid, int carryOverride)
{
this.slot = slot;
this.carryOverride = carryOverride;
this.entityid = entityid;
}
public void toBytes(ByteBuf buf)
{
buf.writeInt(this.slot);
buf.writeInt(this.carryOverride);
buf.writeInt(this.entityid);
}
public boolean handle(Supplier<NetworkEvent.Context> ctx)
{
if (ctx.get().getDirection().getReceptionSide().isClient())
{
ctx.get().setPacketHandled(true);
ctx.get().enqueueWork(() -> {
Level level = CarryOn.proxy.getLevel();
ctx.get().setPacketHandled(true);
if (level != null)
{
Entity e = level.getEntity(this.entityid);
if (e instanceof Player player)
{
if (this.slot >= 9)
{
player.getPersistentData().remove("carrySlot");
player.getPersistentData().remove("overrideKey");
}
else
{
player.getPersistentData().putInt("carrySlot", this.slot);
if (this.carryOverride != 0)
ScriptChecker.setCarryOnOverride(player, this.carryOverride);
}
}
}
});
}
return true;
}
}

View File

@ -1,60 +0,0 @@
package tschipp.carryon.network.client;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.function.Supplier;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraftforge.network.NetworkEvent;
import tschipp.carryon.common.scripting.CarryOnOverride;
import tschipp.carryon.common.scripting.ScriptReader;
public class ScriptReloadPacket
{
private List<CarryOnOverride> overrides = new ArrayList<>();
// public ScriptReloadPacket()
// {
// }
public ScriptReloadPacket(Collection<CarryOnOverride> collection)
{
this.overrides.addAll(collection);
}
public ScriptReloadPacket(FriendlyByteBuf buf)
{
int size = buf.readInt();
for (int i = 0; i < size; i++)
{
this.overrides.add(CarryOnOverride.deserialize(buf));
}
}
public void toBytes(FriendlyByteBuf buf)
{
buf.writeInt(this.overrides.size());
this.overrides.forEach(override -> override.serialize(buf));
}
public boolean handle(Supplier<NetworkEvent.Context> ctx)
{
if (ctx.get().getDirection().getReceptionSide().isClient())
{
ctx.get().setPacketHandled(true);
ctx.get().enqueueWork(() -> {
ScriptReader.OVERRIDES.clear();
this.overrides.forEach(override -> {
ScriptReader.OVERRIDES.put(override.hashCode(), override);
});
});
}
return true;
}
}

View File

@ -1,46 +0,0 @@
package tschipp.carryon.network.server;
import java.util.function.Supplier;
import io.netty.buffer.ByteBuf;
import net.minecraft.server.level.ServerPlayer;
import net.minecraftforge.network.NetworkEvent;
import tschipp.carryon.client.keybinds.CarryOnKeybinds;
public class SyncKeybindPacket
{
public boolean pressed;
public SyncKeybindPacket(ByteBuf buf)
{
this.pressed = buf.readBoolean();
}
public SyncKeybindPacket(boolean pressed)
{
this.pressed = pressed;
}
public void toBytes(ByteBuf buf)
{
buf.writeBoolean(this.pressed);
}
public boolean handle(Supplier<NetworkEvent.Context> ctx)
{
if (ctx.get().getDirection().getReceptionSide().isServer())
{
ctx.get().setPacketHandled(true);
ctx.get().enqueueWork(() -> {
ServerPlayer player = ctx.get().getSender();
CarryOnKeybinds.setKeyPressed(player, this.pressed);
});
}
return true;
}
}

View File

@ -1,36 +0,0 @@
package tschipp.carryon.proxy;
import net.minecraft.client.Minecraft;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import tschipp.carryon.client.keybinds.CarryOnKeybinds;
import tschipp.carryon.common.handler.RegistrationHandler;
import tschipp.carryon.common.helper.KeyboardCallbackWrapper;
import tschipp.carryon.common.helper.ScrollCallbackWrapper;
public class ClientProxy implements IProxy
{
@Override
public void setup(FMLCommonSetupEvent event)
{
RegistrationHandler.regClientEvents();
new ScrollCallbackWrapper().setup(Minecraft.getInstance());
new KeyboardCallbackWrapper().setup(Minecraft.getInstance());
}
@Override
public Player getPlayer()
{
return Minecraft.getInstance().player;
}
@Override
public Level getLevel()
{
return Minecraft.getInstance().level;
}
}

View File

@ -1,15 +0,0 @@
package tschipp.carryon.proxy;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
public interface IProxy
{
public void setup(final FMLCommonSetupEvent event);
public Player getPlayer();
public Level getLevel();
}

View File

@ -1,28 +0,0 @@
package tschipp.carryon.proxy;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
public class ServerProxy implements IProxy
{
@Override
public void setup(FMLCommonSetupEvent event)
{
}
@Override
public Player getPlayer()
{
return null;
}
@Override
public Level getLevel()
{
return null;
}
}

View File

@ -1,32 +0,0 @@
modLoader="javafml"
loaderVersion="[41,)"
issueTrackerURL="https://github.com/Tschipp/CarryOn/issues"
logoFile="logo.png"
license="GNU LGPLv3"
[[mods]]
modId="carryon"
version="${file.jarVersion}"
displayName="Carry On"
description='''Carry On is a simple mod that improves game interaction by allowing players to pick up, carry, and place single block Tile Entities using only their empty hands.'''
authors="Tschipp, Purplicious_Cow, cy4n" #mandatory
displayURL="https://minecraft.curseforge.com/projects/carry-on" #mandatory
[[dependencies.carryon]] #optional
# the modid of the dependency
modId="forge" #mandatory
# Does this dependency have to exist - if not, ordering below must be specified
mandatory=true #mandatory
# The version range of the dependency
versionRange="[41,)" #mandatory
# An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory
ordering="NONE"
# Side this dependency is applied on - BOTH, CLIENT or SERVER
side="BOTH"
[[dependencies.carryon]]
modId="minecraft"
mandatory=true
versionRange="[1.19,1.20)"
ordering="NONE"
side="BOTH"

View File

@ -1,16 +0,0 @@
{
"carryon.category.settings": "sᵷuᴉʇʇǝS",
"carryon.category.blacklist": "ʇsᴉꞁʞɔɐꞁᗺ",
"carryon.category.modeloverrides": "(pǝɔuɐʌpⱯ) sǝpᴉɹɹǝʌO ꞁǝpoW",
"carryon.category.custompickupconditions": "(pǝɔuɐʌpⱯ) suoᴉʇᴉpuoƆ dnʞɔᴉԀ ɯoʇsnƆ",
"carryon.category.whitelist": "ʇsᴉꞁǝʇᴉɥM",
"carryon.general.modeloverrides.modeloverrides": "sǝpᴉɹɹǝʌO ꞁǝpoW",
"carryon.general.blacklist.forbiddenentities": "dn ʞɔᴉd ʇouuɐɔ ɹǝʎɐꞁԀ ǝɥʇ ʇɐɥʇ sǝᴉʇᴉʇuƎ",
"carryon.general.blacklist.forbiddentiles": "dn ʞɔᴉd ʇouuɐɔ ɹǝʎɐꞁԀ ǝɥʇ ʇɐɥʇ sʞɔoꞁᗺ",
"carryon.category.custompickupconditions.custompickupconditionsblocks": "suoᴉʇᴉpuoƆ dnʞɔᴉԀ ʞɔoꞁᗺ ɯoʇsnƆ",
"carryon.category.custompickupconditions.custompickupconditionsentities": "suoᴉʇᴉpuoƆ dnʞɔᴉԀ ʎʇᴉʇuƎ ɯoʇsnƆ",
"key.carry.desc": "ʎɹɹɐƆ",
"key.carry.category": "uO ʎɹɹɐƆ"
}

View File

@ -1,16 +0,0 @@
{
"carryon.category.settings": "Settings",
"carryon.category.blacklist": "Blacklist",
"carryon.category.modeloverrides": "Model Overrides (Advanced)",
"carryon.category.custompickupconditions": "Custom Pickup Conditions (Advanced)",
"carryon.category.whitelist": "Whitelist",
"carryon.general.modeloverrides.modeloverrides": "Model Overrides",
"carryon.general.blacklist.forbiddenentities": "Entities that the Player cannot pick up",
"carryon.general.blacklist.forbiddentiles": "Blocks that the Player cannot pick up",
"carryon.category.custompickupconditions.custompickupconditionsblocks": "Custom Block Pickup Conditions",
"carryon.category.custompickupconditions.custompickupconditionsentities": "Custom Entity Pickup Conditions",
"key.carry.desc": "Carry",
"key.carry.category": "Carry On"
}

View File

@ -1,16 +0,0 @@
{
"carryon.category.settings": "Configuración",
"carryon.category.blacklist": "Lista negra",
"carryon.category.modeloverrides": "Reescribir modelo (Avanzado)",
"carryon.category.custompickupconditions": "Customizar condiciones de recoger (Avanzado)",
"carryon.category.whitelist": "Lista blanca",
"carryon.general.modeloverrides.modeloverrides": "Reescribir modelo",
"carryon.general.blacklist.forbiddenentities": "Entidades que el jugador no puede recoger",
"carryon.general.blacklist.forbiddentiles": "Bloques que el jugador no puede recoger",
"carryon.category.custompickupconditions.custompickupconditionsblocks": "Customizar condiciones para recoger bloques",
"carryon.category.custompickupconditions.custompickupconditionsentities": "Customizar condiciones para recoger entidades",
"key.carry.desc": "Agarrar",
"key.carry.category": "Carry On"
}

View File

@ -1,16 +0,0 @@
{
"carryon.category.settings": "Inpostazioni",
"carryon.category.blacklist": "Blacklist",
"carryon.category.modeloverrides": "Sostituzioni modello (avanzate)",
"carryon.category.custompickupconditions": "Condizioni di prelievo personalizzate (avanzate)",
"carryon.category.whitelist": "Whitelist",
"carryon.general.modeloverrides.modeloverrides": "Sostituzioni modello",
"carryon.general.blacklist.forbiddenentities": "Entità che il giocatore non può raccogliere",
"carryon.general.blacklist.forbiddentiles": "Blocchi che il giocatore non può raccogliere",
"carryon.category.custompickupconditions.custompickupconditionsblocks": "Condizioni di prelievo blocco personalizzate",
"carryon.category.custompickupconditions.custompickupconditionsentities": "Condizioni di prelievo entità personalizzate",
"key.carry.desc": "Afferra",
"key.carry.category": "Carry On Mod"
}

View File

@ -1,16 +0,0 @@
{
"carryon.category.settings": "설정",
"carryon.category.blacklist": "블랙리스트",
"carryon.category.modeloverrides": "모델 오버라이딩 (고급)",
"carryon.category.custompickupconditions": "커스텀 들기 컨디션 (고급)",
"carryon.category.whitelist": "화이트리스트",
"carryon.general.modeloverrides.modeloverrides": "모델 오버라이딩",
"carryon.general.blacklist.forbiddenentities": "플레이어가 들 수 없는 엔티티",
"carryon.general.blacklist.forbiddentiles": "플레이어가 들 수 없는 블록",
"carryon.category.custompickupconditions.custompickupconditionsblocks": "커스텀 블록 들기 컨디션",
"carryon.category.custompickupconditions.custompickupconditionsentities": "커스텀 엔티티 들기 컨디션",
"key.carry.desc": "들고 나르기",
"key.carry.category": "Carry On"
}

View File

@ -1,16 +0,0 @@
{
"carryon.category.settings": "Настройки",
"carryon.category.blacklist": "Чёрный список",
"carryon.category.modeloverrides": "Переопределения модели (Улучшенное)",
"carryon.category.custompickupconditions": "Индивидуальные условия поднятия (Улучшенное)",
"carryon.category.whitelist": "Белый список",
"carryon.general.modeloverrides.modeloverrides": "Переопределения модели",
"carryon.general.blacklist.forbiddenentities": "Сущности, которых игрок не может поднять",
"carryon.general.blacklist.forbiddentiles": "Блоки, которые игрок не может поднять",
"carryon.category.custompickupconditions.custompickupconditionsblocks": "Пользовательские условия поднятия блока",
"carryon.category.custompickupconditions.custompickupconditionsentities": "Пользовательские условия поднятия сущности",
"key.carry.desc": "Поднять",
"key.carry.category": "Carry On"
}

View File

@ -1,6 +0,0 @@
{
"parent": "item/generated",
"textures": {
"layer0": "carryon:item/tile"
}
}

View File

@ -1,6 +0,0 @@
{
"parent": "item/generated",
"textures": {
"layer0": "carryon:item/tile"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 198 B

View File

@ -1,5 +0,0 @@
{
"replace": false,
"values": [
]
}

View File

@ -1,5 +0,0 @@
{
"replace": false,
"values": [
]
}

View File

@ -1,5 +0,0 @@
{
"replace": false,
"values": [
]
}

View File

@ -1,5 +0,0 @@
{
"replace": false,
"values": [
]
}

View File

@ -1,5 +0,0 @@
{
"replace": false,
"values": [
]
}

View File

@ -1,5 +0,0 @@
{
"replace": false,
"values": [
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 KiB

View File

@ -1,6 +0,0 @@
{
"pack": {
"description": "Carryon Resources and Data",
"pack_format": 6
}
}