添加了javadoc, 调整API,添加self方法

This commit is contained in:
叁玖领域 2025-10-19 13:34:49 +08:00
parent a24314789a
commit 6553f04b4e
112 changed files with 5146 additions and 537 deletions

4
.gitignore vendored
View File

@ -1,4 +1,6 @@
.gradle .gradle
.idea
.run
build/ build/
!gradle/wrapper/gradle-wrapper.jar !gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/ !**/src/main/**/build/
@ -44,3 +46,5 @@ bin/
# Ignore Gradle build output directory # Ignore Gradle build output directory
build build
/RenderDoc_1.40_64/ /RenderDoc_1.40_64/
/.run/
/.idea/

8
.idea/.gitignore vendored
View File

@ -1,8 +0,0 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@ -1,10 +0,0 @@
<component name="CopyrightManager">
<settings>
<module2copyright>
<element module="All" copyright="GPLv3" />
</module2copyright>
<LanguageOptions name="JAVA">
<option name="fileTypeOverride" value="3" />
</LanguageOptions>
</settings>
</component>

View File

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="distributionType" value="LOCAL" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleHome" value="$PROJECT_DIR$/../../projEnv/gradle/gradle-8.14.2" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
</GradleProjectSettings>
</option>
</component>
</project>

View File

@ -1,9 +0,0 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="AutoCloseableResource" enabled="true" level="WARNING" enabled_by_default="true">
<option name="METHOD_MATCHER_CONFIG" value="java.util.Formatter,format,java.io.Writer,append,com.google.common.base.Preconditions,checkNotNull,org.hibernate.Session,close,java.io.PrintWriter,printf,java.io.PrintStream,printf,net.minecraft.world.entity.Entity,level" />
</inspection_tool>
<inspection_tool class="ClassCanBeRecord" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
</profile>
</component>

View File

@ -1,204 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaDocConfiguration">
<GENERAL>
<MODE>UPDATE</MODE>
<OVERRIDDEN_METHODS>false</OVERRIDDEN_METHODS>
<SPLITTED_CLASS_NAME>true</SPLITTED_CLASS_NAME>
<LEVELS>
<LEVEL>TYPE</LEVEL>
<LEVEL>METHOD</LEVEL>
<LEVEL>FIELD</LEVEL>
</LEVELS>
<VISIBILITIES>
<VISIBILITY>PUBLIC</VISIBILITY>
<VISIBILITY>PROTECTED</VISIBILITY>
<VISIBILITY>DEFAULT</VISIBILITY>
</VISIBILITIES>
</GENERAL>
<TEMPLATES>
<CLASSES>
<CLASS>
<KEY>^.*(public|protected|private)*.+interface\s+\w+.*</KEY>
<VALUE>/**\n
* The interface ${name}.\n
&lt;#if element.typeParameters?has_content&gt; * \n
&lt;/#if&gt;
&lt;#list element.typeParameters as typeParameter&gt;
* @param &lt;${typeParameter.name}&gt; the type parameter\n
&lt;/#list&gt;
*/</VALUE>
</CLASS>
<CLASS>
<KEY>^.*(public|protected|private)*.+enum\s+\w+.*</KEY>
<VALUE>/**\n
* The enum ${name}.\n
*/</VALUE>
</CLASS>
<CLASS>
<KEY>^.*(public|protected|private)*.+class\s+\w+.*</KEY>
<VALUE>/**\n
* The type ${name}.\n
&lt;#if element.typeParameters?has_content&gt; * \n
&lt;/#if&gt;
&lt;#list element.typeParameters as typeParameter&gt;
* @param &lt;${typeParameter.name}&gt; the type parameter\n
&lt;/#list&gt;
*/</VALUE>
</CLASS>
<CLASS>
<KEY>.+</KEY>
<VALUE>/**\n
* The type ${name}.\n
*/</VALUE>
</CLASS>
</CLASSES>
<CONSTRUCTORS>
<CONSTRUCTOR>
<KEY>.+</KEY>
<VALUE>/**\n
* Instantiates a new ${name}.\n
&lt;#if element.parameterList.parameters?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.parameterList.parameters as parameter&gt;
* @param ${parameter.name} the ${paramNames[parameter.name]}\n
&lt;/#list&gt;
&lt;#if element.throwsList.referenceElements?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.throwsList.referenceElements as exception&gt;
* @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
&lt;/#list&gt;
*/</VALUE>
</CONSTRUCTOR>
</CONSTRUCTORS>
<METHODS>
<METHOD>
<KEY>^.*(public|protected|private)*\s*.*(\w(\s*&lt;.+&gt;)*)+\s+get\w+\s*\(.*\).+</KEY>
<VALUE>/**\n
* Gets ${partName}.\n
&lt;#if element.typeParameters?has_content&gt; * \n
&lt;/#if&gt;
&lt;#list element.typeParameters as typeParameter&gt;
* @param &lt;${typeParameter.name}&gt; the type parameter\n
&lt;/#list&gt;
&lt;#if element.parameterList.parameters?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.parameterList.parameters as parameter&gt;
* @param ${parameter.name} the ${paramNames[parameter.name]}\n
&lt;/#list&gt;
&lt;#if isNotVoid&gt;
*\n
* @return the ${partName}\n
&lt;/#if&gt;
&lt;#if element.throwsList.referenceElements?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.throwsList.referenceElements as exception&gt;
* @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
&lt;/#list&gt;
*/</VALUE>
</METHOD>
<METHOD>
<KEY>^.*(public|protected|private)*\s*.*(void|\w(\s*&lt;.+&gt;)*)+\s+set\w+\s*\(.*\).+</KEY>
<VALUE>/**\n
* Sets ${partName}.\n
&lt;#if element.typeParameters?has_content&gt; * \n
&lt;/#if&gt;
&lt;#list element.typeParameters as typeParameter&gt;
* @param &lt;${typeParameter.name}&gt; the type parameter\n
&lt;/#list&gt;
&lt;#if element.parameterList.parameters?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.parameterList.parameters as parameter&gt;
* @param ${parameter.name} the ${paramNames[parameter.name]}\n
&lt;/#list&gt;
&lt;#if isNotVoid&gt;
*\n
* @return the ${partName}\n
&lt;/#if&gt;
&lt;#if element.throwsList.referenceElements?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.throwsList.referenceElements as exception&gt;
* @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
&lt;/#list&gt;
*/</VALUE>
</METHOD>
<METHOD>
<KEY>^.*((public\s+static)|(static\s+public))\s+void\s+main\s*\(\s*String\s*(\[\s*\]|\.\.\.)\s+\w+\s*\).+</KEY>
<VALUE>/**\n
* The entry point of application.\n
&lt;#if element.parameterList.parameters?has_content&gt;
*\n
&lt;/#if&gt;
* @param ${element.parameterList.parameters[0].name} the input arguments\n
&lt;#if element.throwsList.referenceElements?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.throwsList.referenceElements as exception&gt;
* @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
&lt;/#list&gt;
*/</VALUE>
</METHOD>
<METHOD>
<KEY>.+</KEY>
<VALUE>/**\n
* ${name}&lt;#if isNotVoid&gt; ${return}&lt;/#if&gt;.\n
&lt;#if element.typeParameters?has_content&gt; * \n
&lt;/#if&gt;
&lt;#list element.typeParameters as typeParameter&gt;
* @param &lt;${typeParameter.name}&gt; the type parameter\n
&lt;/#list&gt;
&lt;#if element.parameterList.parameters?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.parameterList.parameters as parameter&gt;
* @param ${parameter.name} the ${paramNames[parameter.name]}\n
&lt;/#list&gt;
&lt;#if isNotVoid&gt;
*\n
* @return the ${return}\n
&lt;/#if&gt;
&lt;#if element.throwsList.referenceElements?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.throwsList.referenceElements as exception&gt;
* @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
&lt;/#list&gt;
*/</VALUE>
</METHOD>
</METHODS>
<FIELDS>
<FIELD>
<KEY>^.*(public|protected|private)*.+static.*(\w\s\w)+.+</KEY>
<VALUE>/**\n
* The constant ${element.getName()}.\n
*/</VALUE>
</FIELD>
<FIELD>
<KEY>^.*(public|protected|private)*.*(\w\s\w)+.+</KEY>
<VALUE>/**\n
&lt;#if element.parent.isInterface()&gt;
* The constant ${element.getName()}.\n
&lt;#else&gt;
* The ${name}.\n
&lt;/#if&gt; */</VALUE>
</FIELD>
<FIELD>
<KEY>.+</KEY>
<VALUE>/**\n
&lt;#if element.parent.isEnum()&gt;
*${name} ${typeName}.\n
&lt;#else&gt;
* The ${name}.\n
&lt;/#if&gt;*/</VALUE>
</FIELD>
</FIELDS>
</TEMPLATES>
</component>
</project>

View File

@ -1,14 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ASMIdeaPluginConfiguration">
<asm skipDebug="false" skipFrames="false" skipCode="false" expandFrames="false" />
<groovy codeStyle="LEGACY" />
</component>
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="FrameworkDetectionExcludesConfiguration">
<file type="web" url="file://$PROJECT_DIR$" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

View File

@ -1,15 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Client" type="Application" factoryName="Application">
<envs>
<env name="MOD_CLASSES" value="superleadrope%%G:\WhimsyMod\SuperLeadRope\build\classes\java\main;superleadrope%%G:\WhimsyMod\SuperLeadRope\build\resources\main" />
</envs>
<option name="MAIN_CLASS_NAME" value="net.neoforged.devlaunch.Main" />
<module name="SuperLeadRope.main" />
<option name="PROGRAM_PARAMETERS" value="@G:\\WhimsyMod\\SuperLeadRope\\build\\moddev\\clientRunProgramArgs.txt" />
<option name="VM_PARAMETERS" value="@G:\\WhimsyMod\\SuperLeadRope\\build\\moddev\\clientRunVmArgs.txt -Dfml.modFolders=superleadrope%%G:\\WhimsyMod\\SuperLeadRope\\build\\classes\\java\\main;superleadrope%%G:\\WhimsyMod\\SuperLeadRope\\build\\resources\\main" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/run" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

View File

@ -1,16 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="RemoteDebug" type="Remote">
<module name="SuperLeadRope.main" />
<option name="USE_SOCKET_TRANSPORT" value="true" />
<option name="SERVER_MODE" value="false" />
<option name="SHMEM_ADDRESS" value="javadebug" />
<option name="HOST" value="localhost" />
<option name="PORT" value="5005" />
<option name="AUTO_RESTART" value="false" />
<RunnerSettings RunnerId="Debug">
<option name="DEBUG_PORT" value="5005" />
<option name="LOCAL" value="false" />
</RunnerSettings>
<method v="2" />
</configuration>
</component>

View File

@ -1,124 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

View File

@ -1,15 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Remote Debug" type="Remote">
<option name="USE_SOCKET_TRANSPORT" value="true" />
<option name="SERVER_MODE" value="false" />
<option name="SHMEM_ADDRESS" value="javadebug" />
<option name="HOST" value="localhost" />
<option name="PORT" value="5005" />
<option name="AUTO_RESTART" value="false" />
<RunnerSettings RunnerId="Debug">
<option name="DEBUG_PORT" value="5005" />
<option name="LOCAL" value="false" />
</RunnerSettings>
<method v="2" />
</configuration>
</component>

View File

@ -89,10 +89,25 @@ import java.util.Optional;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
/**
* The type Common event handler.
*/
public class CommonEventHandler { public class CommonEventHandler {
/**
* The constant leashConfigManager.
*/
public volatile static LeashConfigManager leashConfigManager; public volatile static LeashConfigManager leashConfigManager;
/**
* The type Game.
*/
@net.minecraftforge.fml.common.Mod.EventBusSubscriber(modid = SuperLeadRope.MOD_ID, bus = net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus.FORGE) @net.minecraftforge.fml.common.Mod.EventBusSubscriber(modid = SuperLeadRope.MOD_ID, bus = net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus.FORGE)
public static class Game { public static class Game {
/**
* On entity join world.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public static void onEntityJoinWorld(EntityJoinLevelEvent event) { public static void onEntityJoinWorld(EntityJoinLevelEvent event) {
Entity entity = event.getEntity(); Entity entity = event.getEntity();
@ -110,6 +125,11 @@ public class CommonEventHandler {
} }
} }
/**
* On entity leave world.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public static void onEntityLeaveWorld(EntityLeaveLevelEvent event) { public static void onEntityLeaveWorld(EntityLeaveLevelEvent event) {
Entity entity = event.getEntity(); Entity entity = event.getEntity();
@ -126,6 +146,12 @@ public class CommonEventHandler {
LeashStateInnerAPI.getLeashState(entity).ifPresent(LeashSyncManager.State::untrack); LeashStateInnerAPI.getLeashState(entity).ifPresent(LeashSyncManager.State::untrack);
} }
} }
/**
* On player logged in.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) { public void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) {
if (!(event.getEntity() instanceof ServerPlayer player)) return; // 只处理服务端 if (!(event.getEntity() instanceof ServerPlayer player)) return; // 只处理服务端
@ -143,6 +169,11 @@ public class CommonEventHandler {
} }
} }
/**
* On player right hit on block.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public static void onPlayerRightHitOnBlock(PlayerInteractEvent.RightClickBlock event) { public static void onPlayerRightHitOnBlock(PlayerInteractEvent.RightClickBlock event) {
Level level = event.getLevel(); Level level = event.getLevel();
@ -159,16 +190,33 @@ public class CommonEventHandler {
} }
} }
/**
* Gets server level.
*
* @return the server level
*/
public static ServerLevel getServerLevel() { public static ServerLevel getServerLevel() {
return sl; return sl;
} }
private static ServerLevel sl; private static ServerLevel sl;
/**
* On server starting.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public static void onServerStarting(ServerStartingEvent event) { public static void onServerStarting(ServerStartingEvent event) {
PotatoMode mode = PotatoModeHelper.getCurrentMode(); PotatoMode mode = PotatoModeHelper.getCurrentMode();
EternalPotatoFacade.init(mode, true); // 服务端 EternalPotatoFacade.init(mode, true); // 服务端
} }
/**
* On world load.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public static void onWorldLoad(LevelEvent.Load event) { public static void onWorldLoad(LevelEvent.Load event) {
if (event.getLevel() instanceof ServerLevel serverLevel) { if (event.getLevel() instanceof ServerLevel serverLevel) {
@ -181,6 +229,11 @@ public class CommonEventHandler {
} }
} }
/**
* On world unload.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public static void onWorldUnload(LevelEvent.Unload event) { public static void onWorldUnload(LevelEvent.Unload event) {
if (event.getLevel() instanceof ServerLevel serverLevel) { if (event.getLevel() instanceof ServerLevel serverLevel) {
@ -192,11 +245,22 @@ public class CommonEventHandler {
} }
} }
// 服务器关闭 /**
* On server stopping.
*
* @param event the event
*/
// 服务器关闭
@SubscribeEvent @SubscribeEvent
public static void onServerStopping(ServerStoppingEvent event) { public static void onServerStopping(ServerStoppingEvent event) {
EternalPotatoFacade.clear(); EternalPotatoFacade.clear();
} }
/**
* On item drop.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public static void onItemDrop(ItemTossEvent event) { public static void onItemDrop(ItemTossEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
@ -231,6 +295,12 @@ public class CommonEventHandler {
); );
} }
} }
/**
* On item pickup.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public static void onItemPickup(@NotNull PlayerEvent.ItemPickupEvent event) { public static void onItemPickup(@NotNull PlayerEvent.ItemPickupEvent event) {
Player player = event.getEntity(); Player player = event.getEntity();
@ -256,6 +326,11 @@ public class CommonEventHandler {
} }
} }
/**
* On entity teleport.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public static void onEntityTeleport(EntityTeleportEvent event) { public static void onEntityTeleport(EntityTeleportEvent event) {
Entity telEntity = event.getEntity(); Entity telEntity = event.getEntity();
@ -326,11 +401,23 @@ public class CommonEventHandler {
RidingApplier.applyRidingRelationship(filteredRelationship, serverLevel::getEntity); RidingApplier.applyRidingRelationship(filteredRelationship, serverLevel::getEntity);
} }
} }
/**
* On player clone.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public static void onPlayerClone(PlayerEvent.Clone event) { public static void onPlayerClone(PlayerEvent.Clone event) {
CapabilityRemainder.onPlayerClone(event); CapabilityRemainder.onPlayerClone(event);
} }
private static int tickCounter = 0; private static int tickCounter = 0;
/**
* On server tick.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public static void onServerTick(TickEvent.ServerTickEvent event) { public static void onServerTick(TickEvent.ServerTickEvent event) {
if (event.phase == TickEvent.Phase.END) { if (event.phase == TickEvent.Phase.END) {
@ -350,42 +437,92 @@ public class CommonEventHandler {
LeashSyncManager.Data.forEach(ILeashData::applyLeashForces); LeashSyncManager.Data.forEach(ILeashData::applyLeashForces);
} }
} }
/**
* On entity attack.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public static void onEntityAttack (AttackEntityEvent event) { public static void onEntityAttack (AttackEntityEvent event) {
LeashInteractHandler.onEntityLeftInteract(event.getEntity().level(), event.getTarget(), event.getEntity(), event); LeashInteractHandler.onEntityLeftInteract(event.getEntity().level(), event.getTarget(), event.getEntity(), event);
} }
/**
* On entity interact.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public static void onEntityInteract (PlayerInteractEvent.EntityInteract event) { public static void onEntityInteract (PlayerInteractEvent.EntityInteract event) {
LeashInteractHandler.onEntityRightInteract(event.getLevel(), event.getHand(), event.getTarget(), event.getEntity(), event); //处理实体互动 LeashInteractHandler.onEntityRightInteract(event.getLevel(), event.getHand(), event.getTarget(), event.getEntity(), event); //处理实体互动
} }
/**
* Attach capability.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public static void attachCapability(AttachCapabilitiesEvent<?> event) { public static void attachCapability(AttachCapabilitiesEvent<?> event) {
CapabilityHandler.attachCapability(event); CapabilityHandler.attachCapability(event);
} }
/**
* On register command.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public static void onRegisterCommand (RegisterCommandsEvent event) { public static void onRegisterCommand (RegisterCommandsEvent event) {
CommandDispatcher<CommandSourceStack> dispatcher = event.getDispatcher(); CommandDispatcher<CommandSourceStack> dispatcher = event.getDispatcher();
MotionCommand.register(dispatcher); MotionCommand.register(dispatcher);
} }
} }
/**
* The type Mod.
*/
@net.minecraftforge.fml.common.Mod.EventBusSubscriber(modid = SuperLeadRope.MOD_ID, bus= net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus.MOD) @net.minecraftforge.fml.common.Mod.EventBusSubscriber(modid = SuperLeadRope.MOD_ID, bus= net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus.MOD)
public static class Mod { public static class Mod {
/**
* On fml common init.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public static void onFMLCommonInit(FMLCommonSetupEvent event) { public static void onFMLCommonInit(FMLCommonSetupEvent event) {
event.enqueueWork(Mod::checkAndSet); event.enqueueWork(Mod::checkAndSet);
event.enqueueWork(SLPGameruleRegistry::register);//规则注册 event.enqueueWork(SLPGameruleRegistry::register);//规则注册
} }
/**
* Register capability.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public static void registerCapability(RegisterCapabilitiesEvent event) { public static void registerCapability(RegisterCapabilitiesEvent event) {
CapabilityHandler.registerCapability(event); CapabilityHandler.registerCapability(event);
} }
/**
* On creative tab.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public static void onCreativeTab (BuildCreativeModeTabContentsEvent event) { public static void onCreativeTab (BuildCreativeModeTabContentsEvent event) {
if (event.getTabKey() == CreativeModeTabs.TOOLS_AND_UTILITIES) { if (event.getTabKey() == CreativeModeTabs.TOOLS_AND_UTILITIES) {
event.accept(SLPItems.SUPER_LEAD_ROPE); event.accept(SLPItems.SUPER_LEAD_ROPE);
} }
} }
/**
* On config reloading.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public void onConfigReloading(ModConfigEvent.Reloading event) { public void onConfigReloading(ModConfigEvent.Reloading event) {
if (event.getConfig().getSpec() == LeashCommonConfig.SPEC) { if (event.getConfig().getSpec() == LeashCommonConfig.SPEC) {
@ -402,6 +539,11 @@ public class CommonEventHandler {
} }
} }
/**
* On config loaded.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public void onConfigLoaded(ModConfigEvent.Loading event) { public void onConfigLoaded(ModConfigEvent.Loading event) {
if (event.getConfig().getSpec() == LeashCommonConfig.SPEC) { if (event.getConfig().getSpec() == LeashCommonConfig.SPEC) {
@ -410,6 +552,11 @@ public class CommonEventHandler {
} }
} }
/**
* On config reloaded.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public void onConfigReloaded(ModConfigEvent.Reloading event) { public void onConfigReloaded(ModConfigEvent.Reloading event) {
if (event.getConfig().getSpec() == LeashCommonConfig.SPEC) { if (event.getConfig().getSpec() == LeashCommonConfig.SPEC) {
@ -418,6 +565,11 @@ public class CommonEventHandler {
} }
} }
/**
* On config unloaded.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public void onConfigUnloaded(ModConfigEvent.Unloading event) { public void onConfigUnloaded(ModConfigEvent.Unloading event) {
if (event.getConfig().getSpec() == LeashCommonConfig.SPEC) { if (event.getConfig().getSpec() == LeashCommonConfig.SPEC) {

View File

@ -30,12 +30,25 @@ import top.r3944realms.superleadrope.core.register.SLPSoundEvents;
import top.r3944realms.superleadrope.network.NetworkHandler; import top.r3944realms.superleadrope.network.NetworkHandler;
import top.r3944realms.superleadrope.util.file.ConfigUtil; import top.r3944realms.superleadrope.util.file.ConfigUtil;
/**
* The type Super lead rope.
*/
@Mod(value = SuperLeadRope.MOD_ID) @Mod(value = SuperLeadRope.MOD_ID)
//TODO: API规范化 //TODO: API规范化
public class SuperLeadRope { public class SuperLeadRope {
/**
* The constant logger.
*/
public static final Logger logger = LoggerFactory.getLogger(SuperLeadRope.class); public static final Logger logger = LoggerFactory.getLogger(SuperLeadRope.class);
/**
* The constant MOD_ID.
*/
public static final String MOD_ID = "superleadrope"; public static final String MOD_ID = "superleadrope";
/**
* Instantiates a new Super lead rope.
*/
public SuperLeadRope() { public SuperLeadRope() {
IEventBus eventBus = FMLJavaModLoadingContext.get().getModEventBus(); IEventBus eventBus = FMLJavaModLoadingContext.get().getModEventBus();
SLPItems.register(eventBus); SLPItems.register(eventBus);
@ -45,6 +58,10 @@ public class SuperLeadRope {
initialize(); initialize();
} }
/**
* Initialize.
*/
public static void initialize() { public static void initialize() {
logger.info("Initializing SuperLeadRope"); logger.info("Initializing SuperLeadRope");
String c = "common"; String c = "common";
@ -53,7 +70,13 @@ public class SuperLeadRope {
ConfigUtil.registerConfig(modLoadingContext, ModConfig.Type.COMMON, LeashCommonConfig.SPEC, c, "leash"); ConfigUtil.registerConfig(modLoadingContext, ModConfig.Type.COMMON, LeashCommonConfig.SPEC, c, "leash");
} }
/**
* The type Mod info.
*/
public static class ModInfo { public static class ModInfo {
/**
* The constant VERSION.
*/
public static final String VERSION; public static final String VERSION;
static { static {
// ModList 获取当前 ModContainer 的元数据 // ModList 获取当前 ModContainer 的元数据

View File

@ -21,7 +21,16 @@ import net.minecraftforge.common.capabilities.CapabilityToken;
import top.r3944realms.superleadrope.api.type.capabilty.ILeashData; import top.r3944realms.superleadrope.api.type.capabilty.ILeashData;
import top.r3944realms.superleadrope.api.type.capabilty.ILeashState; import top.r3944realms.superleadrope.api.type.capabilty.ILeashState;
/**
* The type Slp capability.
*/
public class SLPCapability { public class SLPCapability {
/**
* The constant LEASH_DATA_CAP.
*/
public static final Capability<ILeashData> LEASH_DATA_CAP = CapabilityManager.get(new CapabilityToken<>(){}); public static final Capability<ILeashData> LEASH_DATA_CAP = CapabilityManager.get(new CapabilityToken<>(){});
/**
* The constant LEASH_STATE_CAP.
*/
public static final Capability<ILeashState> LEASH_STATE_CAP = CapabilityManager.get(new CapabilityToken<>() {}); public static final Capability<ILeashState> LEASH_STATE_CAP = CapabilityManager.get(new CapabilityToken<>() {});
} }

View File

@ -18,64 +18,201 @@ package top.r3944realms.superleadrope.api;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import top.r3944realms.superleadrope.api.type.capabilty.ILeashData;
import top.r3944realms.superleadrope.api.type.capabilty.ILeashState;
import top.r3944realms.superleadrope.api.type.util.ILeashHelper; import top.r3944realms.superleadrope.api.type.util.ILeashHelper;
import top.r3944realms.superleadrope.api.workspace.Services; import top.r3944realms.superleadrope.api.workspace.Services;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.UUID; import java.util.UUID;
import java.util.function.Predicate; import java.util.function.Predicate;
/**
* The type Super lead rope api.
*/
@SuppressWarnings("unused") @SuppressWarnings("unused")
public class SuperLeadRopeApi { public class SuperLeadRopeApi {
/**
* The constant LOGGER.
*/
public static final Logger LOGGER = LoggerFactory.getLogger(SuperLeadRopeApi.class); public static final Logger LOGGER = LoggerFactory.getLogger(SuperLeadRopeApi.class);
/**
* The constant MOD_ID.
*/
public static String MOD_ID = "superleadrope"; public static String MOD_ID = "superleadrope";
/**
* Gets leash helper.
*
* @return the leash helper
*/
public static ILeashHelper getLeashHelper() { public static ILeashHelper getLeashHelper() {
return Services.WORK_SPACE.getLeashHelper(); return Services.WORK_SPACE.getLeashHelper();
} }
/**
* Leashable in area list.
*
* @param pLevel the p level
* @param pPos the p pos
* @param filter the filter
* @return the list
*/
public static @NotNull List<Entity> leashableInArea(Level pLevel, Vec3 pPos, Predicate<Entity> filter) { public static @NotNull List<Entity> leashableInArea(Level pLevel, Vec3 pPos, Predicate<Entity> filter) {
return leashableInArea(pLevel, pPos, filter, 1024D); return leashableInArea(pLevel, pPos, filter, 1024D);
} }
/**
* Leashable in area list.
*
* @param entity the entity
* @param filter the filter
* @param fetchDistance the fetch distance
* @return the list
*/
public static @NotNull List<Entity> leashableInArea(@NotNull Entity entity, Predicate<Entity> filter, double fetchDistance) { public static @NotNull List<Entity> leashableInArea(@NotNull Entity entity, Predicate<Entity> filter, double fetchDistance) {
return leashableInArea(entity.level(), entity.getBoundingBox().getCenter(), filter, fetchDistance); return leashableInArea(entity.level(), entity.getBoundingBox().getCenter(), filter, fetchDistance);
} }
/**
* Leashable in area list.
*
* @param pLevel the p level
* @param pPos the p pos
* @param filter the filter
* @param fetchDistance the fetch distance
* @return the list
*/
public static @NotNull List<Entity> leashableInArea(@NotNull Level pLevel, Vec3 pPos, Predicate<Entity> filter, double fetchDistance) { public static @NotNull List<Entity> leashableInArea(@NotNull Level pLevel, Vec3 pPos, Predicate<Entity> filter, double fetchDistance) {
return Services.WORK_SPACE.leashableInArea(pLevel, pPos, filter, fetchDistance); return Services.WORK_SPACE.leashableInArea(pLevel, pPos, filter, fetchDistance);
} }
/**
* Leashable in area list.
*
* @param entity the entity
* @param filter the filter
* @return the list
*/
public static @NotNull List<Entity> leashableInArea(Entity entity, Predicate<Entity> filter) { public static @NotNull List<Entity> leashableInArea(Entity entity, Predicate<Entity> filter) {
return leashableInArea(entity, filter, 1024D); return leashableInArea(entity, filter, 1024D);
} }
/**
* Leashable in area list.
*
* @param holder the holder
* @return the list
*/
public static @NotNull List<Entity> leashableInArea(Entity holder) { public static @NotNull List<Entity> leashableInArea(Entity holder) {
return leashableInArea(holder, i -> isLeashHolder(i, holder), 1024D); return leashableInArea(holder, i -> isLeashHolder(i, holder), 1024D);
} }
/**
* Leashable in area list.
*
* @param holder the holder
* @param clazz the clazz
* @param box the box
* @param filter the filter
* @return the list
*/
public static @NotNull List<Entity> leashableInArea(Entity holder, Class<Entity> clazz, AABB box, Predicate<Entity> filter) {
return Services.WORK_SPACE.leashableInArea(holder.level(), clazz, i -> isLeashHolder(i, holder), box);
}
/**
* Is super lead knot boolean.
*
* @param entity the entity
* @return the boolean
*/
public static boolean isSuperLeadKnot(Entity entity) { public static boolean isSuperLeadKnot(Entity entity) {
return Services.WORK_SPACE.isSuperLeadKnot(entity); return Services.WORK_SPACE.isSuperLeadKnot(entity);
} }
/**
* Gets super lead knot pos.
*
* @param entity the entity
* @return the super lead knot pos
*/
public static BlockPos getSuperLeadKnotPos(Entity entity) { public static BlockPos getSuperLeadKnotPos(Entity entity) {
return Services.WORK_SPACE.getSuperLeadPos(entity); return Services.WORK_SPACE.getSuperLeadPos(entity);
} }
/**
* Is leashable boolean.
*
* @param entity the entity
* @return the boolean
*/
public static boolean isLeashable(Entity entity) { public static boolean isLeashable(Entity entity) {
return Services.WORK_SPACE.isLeashable(entity); return Services.WORK_SPACE.isLeashable(entity);
} }
/**
* Is leash holder boolean.
*
* @param pEntity the p entity
* @param pTestHolder the p test holder
* @return the boolean
*/
public static boolean isLeashHolder(@NotNull Entity pEntity, Entity pTestHolder) { public static boolean isLeashHolder(@NotNull Entity pEntity, Entity pTestHolder) {
return Services.WORK_SPACE.isSuperLeadKnot(pTestHolder) ? return Services.WORK_SPACE.isSuperLeadKnot(pTestHolder) ?
isLeashHolder(pEntity, Services.WORK_SPACE.getSuperLeadPos(pTestHolder)) : isLeashHolder(pEntity, Services.WORK_SPACE.getSuperLeadPos(pTestHolder)) :
isLeashHolder(pEntity, pTestHolder.getUUID()); isLeashHolder(pEntity, pTestHolder.getUUID());
} }
/**
* Is leash holder boolean.
*
* @param pEntity the p entity
* @param pHolderUUID the p holder uuid
* @return the boolean
*/
public static boolean isLeashHolder(@NotNull Entity pEntity, UUID pHolderUUID) { public static boolean isLeashHolder(@NotNull Entity pEntity, UUID pHolderUUID) {
return Services.WORK_SPACE.getLeashData(pEntity) return Services.WORK_SPACE.getLeashData(pEntity)
.map(leashData -> leashData.isLeashedBy(pHolderUUID)) .map(leashData -> leashData.isLeashedBy(pHolderUUID))
.orElse(false); .orElse(false);
} }
/**
* Is leash holder boolean.
*
* @param pEntity the p entity
* @param pKnotPos the p knot pos
* @return the boolean
*/
public static boolean isLeashHolder(@NotNull Entity pEntity, BlockPos pKnotPos) { public static boolean isLeashHolder(@NotNull Entity pEntity, BlockPos pKnotPos) {
return Services.WORK_SPACE.getLeashData(pEntity) return Services.WORK_SPACE.getLeashData(pEntity)
.map(leashData -> leashData.isLeashedBy(pKnotPos)) .map(leashData -> leashData.isLeashedBy(pKnotPos))
.orElse(false); .orElse(false);
} }
/**
* Gets leash state.
*
* @param pEntity the p entity
* @return the leash state
*/
public static Optional<ILeashState> getLeashState(Entity pEntity) {
return Services.WORK_SPACE.getLeashState(pEntity);
}
/**
* Gets leash data.
*
* @param pEntity the p entity
* @return the leash data
*/
public static Optional<ILeashData> getLeashData(Entity pEntity) {
return Services.WORK_SPACE.getLeashData(pEntity);
}
} }

View File

@ -30,18 +30,35 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
/**
* The type Super lead rope event.
*/
@SuppressWarnings("unused") @SuppressWarnings("unused")
public abstract class SuperLeadRopeEvent extends Event implements IModBusEvent { public abstract class SuperLeadRopeEvent extends Event implements IModBusEvent {
private final Entity LeashedEntity; private final Entity LeashedEntity;
/**
* Instantiates a new Super lead rope event.
*
* @param leashedEntity the leashed entity
*/
protected SuperLeadRopeEvent(Entity leashedEntity) { protected SuperLeadRopeEvent(Entity leashedEntity) {
LeashedEntity = leashedEntity; LeashedEntity = leashedEntity;
} }
/**
* Gets leashed entity.
*
* @return the leashed entity
*/
public Entity getLeashedEntity() { public Entity getLeashedEntity() {
return LeashedEntity; return LeashedEntity;
} }
// ADD LEASH
/**
* The type Add leash.
*/
// ADD LEASH
@SuppressWarnings("unused") @SuppressWarnings("unused")
@Cancelable @Cancelable
public static class AddLeash extends SuperLeadRopeEvent { public static class AddLeash extends SuperLeadRopeEvent {
@ -50,33 +67,85 @@ public abstract class SuperLeadRopeEvent extends Event implements IModBusEvent {
private final Double maxLeashDistance; private final Double maxLeashDistance;
@Nullable @Nullable
private final Double elasticDistanceScale; private final Double elasticDistanceScale;
/**
* Instantiates a new Add leash.
*
* @param leashedEntity the leashed entity
* @param holderEntity the holder entity
*/
public AddLeash(Entity leashedEntity, Entity holderEntity) { public AddLeash(Entity leashedEntity, Entity holderEntity) {
this(leashedEntity, holderEntity, null, null); this(leashedEntity, holderEntity, null, null);
} }
/**
* Instantiates a new Add leash.
*
* @param leashedEntity the leashed entity
* @param holderEntity the holder entity
* @param maxLeashDistance the max leash distance
* @param elasticDistanceScale the elastic distance scale
*/
public AddLeash(Entity leashedEntity, Entity holderEntity, @Nullable Double maxLeashDistance, @Nullable Double elasticDistanceScale) { public AddLeash(Entity leashedEntity, Entity holderEntity, @Nullable Double maxLeashDistance, @Nullable Double elasticDistanceScale) {
super(leashedEntity); super(leashedEntity);
this.holderEntity = holderEntity; this.holderEntity = holderEntity;
this.maxLeashDistance = maxLeashDistance; this.maxLeashDistance = maxLeashDistance;
this.elasticDistanceScale = elasticDistanceScale; this.elasticDistanceScale = elasticDistanceScale;
} }
/**
* Gets holder entity.
*
* @return the holder entity
*/
public Entity getHolderEntity() { public Entity getHolderEntity() {
return holderEntity; return holderEntity;
} }
/**
* Gets max leash distance.
*
* @return the max leash distance
*/
public @Nullable Double getMaxLeashDistance() { public @Nullable Double getMaxLeashDistance() {
return maxLeashDistance; return maxLeashDistance;
} }
/**
* Gets elastic distance scale.
*
* @return the elastic distance scale
*/
public @Nullable Double getElasticDistanceScale() { public @Nullable Double getElasticDistanceScale() {
return elasticDistanceScale; return elasticDistanceScale;
} }
} }
// REMOVE LEASH
/**
* The type Remove leash.
*/
// REMOVE LEASH
@SuppressWarnings("unused") @SuppressWarnings("unused")
@Cancelable @Cancelable
public static class RemoveLeash extends SuperLeadRopeEvent { public static class RemoveLeash extends SuperLeadRopeEvent {
private final LeashHolder leashHolder; private final LeashHolder leashHolder;
/**
* Instantiates a new Remove leash.
*
* @param leashedEntity the leashed entity
* @param holderEntity the holder entity
*/
public RemoveLeash(Entity leashedEntity, UUID holderEntity) { public RemoveLeash(Entity leashedEntity, UUID holderEntity) {
this(leashedEntity, holderEntity, null, false); this(leashedEntity, holderEntity, null, false);
} }
/**
* Instantiates a new Remove leash.
*
* @param leashedEntity the leashed entity
* @param holderKnot the holder knot
*/
public RemoveLeash(Entity leashedEntity, BlockPos holderKnot) { public RemoveLeash(Entity leashedEntity, BlockPos holderKnot) {
this(leashedEntity, null, holderKnot, true); this(leashedEntity, null, holderKnot, true);
} }
@ -86,20 +155,45 @@ public abstract class SuperLeadRopeEvent extends Event implements IModBusEvent {
leashHolder = new LeashHolder(holderPos); leashHolder = new LeashHolder(holderPos);
} else leashHolder = new LeashHolder(holderEntity); } else leashHolder = new LeashHolder(holderEntity);
} }
/**
* Gets leash holder.
*
* @return the leash holder
*/
public LeashHolder getLeashHolder() { public LeashHolder getLeashHolder() {
return leashHolder; return leashHolder;
} }
} }
// TRANSFORM LEASH /**
* The type Transfer leash.
*/
// TRANSFORM LEASH
@SuppressWarnings("unused") @SuppressWarnings("unused")
@Cancelable @Cancelable
public static class TransferLeash extends SuperLeadRopeEvent { public static class TransferLeash extends SuperLeadRopeEvent {
private final LeashHolder oldLeashHolder; private final LeashHolder oldLeashHolder;
private final Entity newLeashHolder; private final Entity newLeashHolder;
/**
* Instantiates a new Transfer leash.
*
* @param leashedEntity the leashed entity
* @param holderEntity the holder entity
* @param newLeashHolder the new leash holder
*/
public TransferLeash(Entity leashedEntity, UUID holderEntity, Entity newLeashHolder) { public TransferLeash(Entity leashedEntity, UUID holderEntity, Entity newLeashHolder) {
this(leashedEntity, holderEntity, null, false , newLeashHolder); this(leashedEntity, holderEntity, null, false , newLeashHolder);
} }
/**
* Instantiates a new Transfer leash.
*
* @param leashedEntity the leashed entity
* @param holderKnot the holder knot
* @param newLeashHolder the new leash holder
*/
public TransferLeash(Entity leashedEntity, BlockPos holderKnot, Entity newLeashHolder) { public TransferLeash(Entity leashedEntity, BlockPos holderKnot, Entity newLeashHolder) {
this(leashedEntity, null, holderKnot, true, newLeashHolder); this(leashedEntity, null, holderKnot, true, newLeashHolder);
} }
@ -111,16 +205,29 @@ public abstract class SuperLeadRopeEvent extends Event implements IModBusEvent {
this.newLeashHolder = newLeashHolder; this.newLeashHolder = newLeashHolder;
} }
/**
* Gets new leash holder.
*
* @return the new leash holder
*/
public Entity getNewLeashHolder() { public Entity getNewLeashHolder() {
return newLeashHolder; return newLeashHolder;
} }
/**
* Gets old leash holder.
*
* @return the old leash holder
*/
public LeashHolder getOldLeashHolder() { public LeashHolder getOldLeashHolder() {
return oldLeashHolder; return oldLeashHolder;
} }
} }
// MODIFY LEASH MAX_LEASH_LENGTH / ELASTIC_DISTANCE_SCALE /**
* The type Modify value.
*/
// MODIFY LEASH MAX_LEASH_LENGTH / ELASTIC_DISTANCE_SCALE
@SuppressWarnings("unused") @SuppressWarnings("unused")
@Cancelable @Cancelable
public static class ModifyValue extends SuperLeadRopeEvent { public static class ModifyValue extends SuperLeadRopeEvent {
@ -132,14 +239,44 @@ public abstract class SuperLeadRopeEvent extends Event implements IModBusEvent {
private final Double newValue; private final Double newValue;
private final Type type; private final Type type;
private final Scope scope; private final Scope scope;
/**
* The enum Type.
*/
public enum Type { public enum Type {
/**
* Max distance type.
*/
MAX_DISTANCE, MAX_DISTANCE,
/**
* Elastic distance scale type.
*/
ELASTIC_DISTANCE_SCALE, ELASTIC_DISTANCE_SCALE,
} }
/**
* The enum Scope.
*/
public enum Scope { public enum Scope {
/**
* Static scope.
*/
STATIC, STATIC,
/**
* Instance scope.
*/
INSTANCE INSTANCE
} }
/**
* Instantiates a new Modify value.
*
* @param leashedEntity the leashed entity
* @param holderUUID the holder uuid
* @param oldValue the old value
* @param newValue the new value
* @param type the type
*/
public ModifyValue(Entity leashedEntity, UUID holderUUID, @Nullable Double oldValue, @Nullable Double newValue, Type type) { public ModifyValue(Entity leashedEntity, UUID holderUUID, @Nullable Double oldValue, @Nullable Double newValue, Type type) {
super(leashedEntity); super(leashedEntity);
this.holder = new LeashHolder(holderUUID); this.holder = new LeashHolder(holderUUID);
@ -148,6 +285,16 @@ public abstract class SuperLeadRopeEvent extends Event implements IModBusEvent {
this.type = type; this.type = type;
this.scope = Scope.INSTANCE; this.scope = Scope.INSTANCE;
} }
/**
* Instantiates a new Modify value.
*
* @param leashedEntity the leashed entity
* @param knotBlockpos the knot blockpos
* @param oldValue the old value
* @param newValue the new value
* @param type the type
*/
public ModifyValue(Entity leashedEntity, BlockPos knotBlockpos, @Nullable Double oldValue, @Nullable Double newValue, Type type) { public ModifyValue(Entity leashedEntity, BlockPos knotBlockpos, @Nullable Double oldValue, @Nullable Double newValue, Type type) {
super(leashedEntity); super(leashedEntity);
this.holder = new LeashHolder(knotBlockpos); this.holder = new LeashHolder(knotBlockpos);
@ -156,6 +303,15 @@ public abstract class SuperLeadRopeEvent extends Event implements IModBusEvent {
this.type = type; this.type = type;
this.scope = Scope.INSTANCE; this.scope = Scope.INSTANCE;
} }
/**
* Instantiates a new Modify value.
*
* @param leashedEntity the leashed entity
* @param oldValue the old value
* @param newValue the new value
* @param type the type
*/
public ModifyValue(Entity leashedEntity, @Nullable Double oldValue, @Nullable Double newValue, Type type) { public ModifyValue(Entity leashedEntity, @Nullable Double oldValue, @Nullable Double newValue, Type type) {
super(leashedEntity); super(leashedEntity);
this.holder = null; this.holder = null;
@ -164,29 +320,58 @@ public abstract class SuperLeadRopeEvent extends Event implements IModBusEvent {
this.type = type; this.type = type;
this.scope = Scope.STATIC; this.scope = Scope.STATIC;
} }
/**
* Gets holder.
*
* @return the holder
*/
public @Nullable LeashHolder getHolder() { public @Nullable LeashHolder getHolder() {
return holder; return holder;
} }
/**
* Gets old value.
*
* @return the old value
*/
public @Nullable Double getOldValue() { public @Nullable Double getOldValue() {
return oldValue; return oldValue;
} }
/**
* Gets new value.
*
* @return the new value
*/
public @Nullable Double getNewValue() { public @Nullable Double getNewValue() {
return newValue; return newValue;
} }
/**
* Gets type.
*
* @return the type
*/
public Type getType() { public Type getType() {
return type; return type;
} }
/**
* Gets scope.
*
* @return the scope
*/
public Scope getScope() { public Scope getScope() {
return scope; return scope;
} }
} }
// HAS FOCUS /**
* The type Has focus.
*/
// HAS FOCUS
@SuppressWarnings("unused") @SuppressWarnings("unused")
@Cancelable @Cancelable
public static class hasFocus extends SuperLeadRopeEvent { public static class hasFocus extends SuperLeadRopeEvent {
@ -194,6 +379,16 @@ public abstract class SuperLeadRopeEvent extends Event implements IModBusEvent {
private final Map<BlockPos, LeashInfo> vaildLeashKnots; private final Map<BlockPos, LeashInfo> vaildLeashKnots;
private final Entity finalForceTarget; private final Entity finalForceTarget;
private Vec3 combinedForce; private Vec3 combinedForce;
/**
* Instantiates a new Has focus.
*
* @param leashedEntity the leashed entity
* @param finalForceTarget the final force target
* @param combinedForce the combined force
* @param vaildLeashHolders the vaild leash holders
* @param vaildLeashKnots the vaild leash knots
*/
public hasFocus(Entity leashedEntity, Entity finalForceTarget, Vec3 combinedForce, Map<UUID, LeashInfo> vaildLeashHolders, Map<BlockPos, LeashInfo> vaildLeashKnots) { public hasFocus(Entity leashedEntity, Entity finalForceTarget, Vec3 combinedForce, Map<UUID, LeashInfo> vaildLeashHolders, Map<BlockPos, LeashInfo> vaildLeashKnots) {
super(leashedEntity); super(leashedEntity);
this.finalForceTarget = finalForceTarget; this.finalForceTarget = finalForceTarget;
@ -202,58 +397,134 @@ public abstract class SuperLeadRopeEvent extends Event implements IModBusEvent {
this.vaildLeashKnots = new HashMap<>(vaildLeashKnots); this.vaildLeashKnots = new HashMap<>(vaildLeashKnots);
} }
/**
* Gets final force target.
*
* @return the final force target
*/
public Entity getFinalForceTarget() { public Entity getFinalForceTarget() {
return finalForceTarget; return finalForceTarget;
} }
/**
* Gets combined force.
*
* @return the combined force
*/
public Vec3 getCombinedForce() { public Vec3 getCombinedForce() {
return combinedForce; return combinedForce;
} }
/**
* Sets combined force.
*
* @param combinedForce the combined force
*/
public void setCombinedForce(Vec3 combinedForce) { public void setCombinedForce(Vec3 combinedForce) {
this.combinedForce = combinedForce; this.combinedForce = combinedForce;
} }
/**
* Gets vaild leash holders.
*
* @return the vaild leash holders
*/
public Map<UUID, LeashInfo> getVaildLeashHolders() { public Map<UUID, LeashInfo> getVaildLeashHolders() {
return vaildLeashHolders; return vaildLeashHolders;
} }
/**
* Gets vaild leash knots.
*
* @return the vaild leash knots
*/
public Map<BlockPos, LeashInfo> getVaildLeashKnots() { public Map<BlockPos, LeashInfo> getVaildLeashKnots() {
return vaildLeashKnots; return vaildLeashKnots;
} }
} }
// KEEP NOT BREAK TICK /**
* The type Keep not break tick.
*/
// KEEP NOT BREAK TICK
@SuppressWarnings("unused") @SuppressWarnings("unused")
public static class keepNotBreakTick extends SuperLeadRopeEvent { public static class keepNotBreakTick extends SuperLeadRopeEvent {
private final int remainedTicks; private final int remainedTicks;
private final Entity holderEntity; private final Entity holderEntity;
private final Map.Entry<?, LeashInfo> entry; private final Map.Entry<?, LeashInfo> entry;
/**
* Instantiates a new Keep not break tick.
*
* @param leashedEntity the leashed entity
* @param remainedTicks the remained ticks
* @param holderEntity the holder entity
* @param entry the entry
*/
public keepNotBreakTick(Entity leashedEntity, int remainedTicks, Entity holderEntity, Map.Entry<?, LeashInfo> entry) { public keepNotBreakTick(Entity leashedEntity, int remainedTicks, Entity holderEntity, Map.Entry<?, LeashInfo> entry) {
super(leashedEntity); super(leashedEntity);
this.remainedTicks = remainedTicks; this.remainedTicks = remainedTicks;
this.holderEntity = holderEntity; this.holderEntity = holderEntity;
this.entry = entry; this.entry = entry;
} }
/**
* Gets holder entity.
*
* @return the holder entity
*/
public Entity getHolderEntity() { public Entity getHolderEntity() {
return holderEntity; return holderEntity;
} }
/**
* Gets remained ticks.
*
* @return the remained ticks
*/
public int getRemainedTicks() { public int getRemainedTicks() {
return remainedTicks; return remainedTicks;
} }
/**
* Reset remained ticks.
*/
public void resetRemainedTicks() { public void resetRemainedTicks() {
entry.setValue(entry.getValue().resetKeepTicks()); entry.setValue(entry.getValue().resetKeepTicks());
} }
/**
* Gets max keep ticks.
*
* @return the max keep ticks
*/
public int getMaxKeepTicks() { public int getMaxKeepTicks() {
return entry.getValue().maxKeepLeashTicks(); return entry.getValue().maxKeepLeashTicks();
} }
} }
// TELEPORT
/**
* The type Teleport with holder.
*/
// TELEPORT
@Cancelable @Cancelable
@SuppressWarnings("unused") @SuppressWarnings("unused")
public static class teleportWithHolder extends SuperLeadRopeEvent { public static class teleportWithHolder extends SuperLeadRopeEvent {
private final Entity holderEntity; private final Entity holderEntity;
private final Level originalLevel, newLevel; private final Level originalLevel, newLevel;
private final Vec3 originalPosition, newPosition; private final Vec3 originalPosition, newPosition;
/**
* Instantiates a new Teleport with holder.
*
* @param leashedEntity the leashed entity
* @param holderEntity the holder entity
* @param originalLevel the original level
* @param newLevel the new level
* @param originalPosition the original position
* @param newPosition the new position
*/
public teleportWithHolder(Entity leashedEntity, Entity holderEntity, Level originalLevel, Level newLevel, Vec3 originalPosition, Vec3 newPosition) { public teleportWithHolder(Entity leashedEntity, Entity holderEntity, Level originalLevel, Level newLevel, Vec3 originalPosition, Vec3 newPosition) {
super(leashedEntity); super(leashedEntity);
this.holderEntity = holderEntity; this.holderEntity = holderEntity;
@ -262,21 +533,48 @@ public abstract class SuperLeadRopeEvent extends Event implements IModBusEvent {
this.originalPosition = originalPosition; this.originalPosition = originalPosition;
this.newPosition = newPosition; this.newPosition = newPosition;
} }
/**
* Gets holder entity.
*
* @return the holder entity
*/
public Entity getHolderEntity() { public Entity getHolderEntity() {
return holderEntity; return holderEntity;
} }
/**
* Gets original position.
*
* @return the original position
*/
public Vec3 getOriginalPosition() { public Vec3 getOriginalPosition() {
return originalPosition; return originalPosition;
} }
/**
* Gets original level.
*
* @return the original level
*/
public Level getOriginalLevel() { public Level getOriginalLevel() {
return originalLevel; return originalLevel;
} }
/**
* Gets new level.
*
* @return the new level
*/
public Level getNewLevel() { public Level getNewLevel() {
return newLevel; return newLevel;
} }
/**
* Gets new position.
*
* @return the new position
*/
public Vec3 getNewPosition() { public Vec3 getNewPosition() {
return newPosition; return newPosition;
} }

View File

@ -30,122 +30,609 @@ import java.util.UUID;
*/ */
@SuppressWarnings("unused") @SuppressWarnings("unused")
public interface ILeashData extends INBTSerializable<CompoundTag> { public interface ILeashData extends INBTSerializable<CompoundTag> {
/**
* Self entity.
*
* @return the entity
*/
Entity self();
/**
* Gets static max distance.
*
* @return the static max distance
*/
Double getStaticMaxDistance(); Double getStaticMaxDistance();
/**
* Sets static max distance.
*
* @param distance the distance
*/
void setStaticMaxDistance(Double distance); void setStaticMaxDistance(Double distance);
/**
* Gets default max distance.
*
* @return the default max distance
*/
double getDefaultMaxDistance(); double getDefaultMaxDistance();
/**
* Gets current max distance.
*
* @return the current max distance
*/
double getCurrentMaxDistance(); double getCurrentMaxDistance();
/**
* Update all max distance.
*/
void updateAllMaxDistance(); void updateAllMaxDistance();
/**
* Gets static elastic distance scale.
*
* @return the static elastic distance scale
*/
Double getStaticElasticDistanceScale(); Double getStaticElasticDistanceScale();
/**
* Sets static elastic distance scale.
*
* @param distance the distance
*/
void setStaticElasticDistanceScale(Double distance); void setStaticElasticDistanceScale(Double distance);
/**
* Gets default elastic distance scale.
*
* @return the default elastic distance scale
*/
double getDefaultElasticDistanceScale(); double getDefaultElasticDistanceScale();
/**
* Gets current elastic distance scale.
*
* @return the current elastic distance scale
*/
double getCurrentElasticDistanceScale(); double getCurrentElasticDistanceScale();
/**
* Update all elastic distance scale.
*/
void updateAllElasticDistanceScale(); void updateAllElasticDistanceScale();
/**
* Update all.
*/
default void updateAll() { default void updateAll() {
updateAllMaxDistance(); updateAllMaxDistance();
updateAllElasticDistanceScale(); updateAllElasticDistanceScale();
} }
/**
* Add leash boolean.
*
* @param holder the holder
* @return the boolean
*/
/* ---------------------- /* ----------------------
* Add / removeApplyEntity leashes * Add / removeApplyEntity leashes
* ---------------------- */ * ---------------------- */
boolean addLeash(Entity holder); boolean addLeash(Entity holder);
/**
* Add leash boolean.
*
* @param holder the holder
* @param reserved the reserved
* @return the boolean
*/
boolean addLeash(Entity holder, String reserved); boolean addLeash(Entity holder, String reserved);
/**
* Add leash boolean.
*
* @param holder the holder
* @param maxDistance the max distance
* @return the boolean
*/
boolean addLeash(Entity holder, Double maxDistance); boolean addLeash(Entity holder, Double maxDistance);
/**
* Add leash boolean.
*
* @param holder the holder
* @param maxDistance the max distance
* @param elasticDistanceScale the elastic distance scale
* @return the boolean
*/
boolean addLeash(Entity holder, Double maxDistance, Double elasticDistanceScale); boolean addLeash(Entity holder, Double maxDistance, Double elasticDistanceScale);
/**
* Add leash boolean.
*
* @param holder the holder
* @param maxDistance the max distance
* @param elasticDistanceScale the elastic distance scale
* @param maxKeepTicks the max keep ticks
* @return the boolean
*/
boolean addLeash(Entity holder, Double maxDistance, Double elasticDistanceScale, int maxKeepTicks); boolean addLeash(Entity holder, Double maxDistance, Double elasticDistanceScale, int maxKeepTicks);
/**
* Add leash boolean.
*
* @param holder the holder
* @param maxDistance the max distance
* @param elasticDistanceScale the elastic distance scale
* @param reserved the reserved
* @return the boolean
*/
boolean addLeash(Entity holder, Double maxDistance, Double elasticDistanceScale, String reserved); boolean addLeash(Entity holder, Double maxDistance, Double elasticDistanceScale, String reserved);
/**
* Add leash boolean.
*
* @param holder the holder
* @param maxDistance the max distance
* @param reserved the reserved
* @return the boolean
*/
boolean addLeash(Entity holder, Double maxDistance, String reserved); boolean addLeash(Entity holder, Double maxDistance, String reserved);
/**
* Add leash boolean.
*
* @param holder the holder
* @param maxDistance the max distance
* @param elasticDistanceScale the elastic distance scale
* @param maxKeepTicks the max keep ticks
* @param reserved the reserved
* @return the boolean
*/
boolean addLeash(Entity holder, Double maxDistance, Double elasticDistanceScale, int maxKeepTicks, String reserved); boolean addLeash(Entity holder, Double maxDistance, Double elasticDistanceScale, int maxKeepTicks, String reserved);
/**
* Add leash.
*
* @param holder the holder
* @param info the info
*/
void addLeash(Entity holder, LeashInfo info); void addLeash(Entity holder, LeashInfo info);
/**
* Add delayed leash.
*
* @param holderPlayer the holder player
*/
void addDelayedLeash(Player holderPlayer); void addDelayedLeash(Player holderPlayer);
/**
* Remove delayed leash.
*
* @param onceHolderPlayerUUID the once holder player uuid
*/
void removeDelayedLeash(UUID onceHolderPlayerUUID); void removeDelayedLeash(UUID onceHolderPlayerUUID);
/**
* Remove leash boolean.
*
* @param holder the holder
* @return the boolean
*/
boolean removeLeash(Entity holder); boolean removeLeash(Entity holder);
/**
* Remove leash boolean.
*
* @param holderUUID the holder uuid
* @return the boolean
*/
boolean removeLeash(UUID holderUUID); boolean removeLeash(UUID holderUUID);
/**
* Remove leash boolean.
*
* @param knotPos the knot pos
* @return the boolean
*/
boolean removeLeash(BlockPos knotPos); boolean removeLeash(BlockPos knotPos);
/**
* Remove all leashes.
*/
void removeAllLeashes(); void removeAllLeashes();
/**
* Remove all holder leashes.
*/
void removeAllHolderLeashes(); void removeAllHolderLeashes();
/**
* Remove all knot leashes.
*/
void removeAllKnotLeashes(); void removeAllKnotLeashes();
/**
* Sets max distance.
*
* @param holder the holder
* @param distance the distance
* @return the max distance
*/
/* ---------------------- /* ----------------------
* Modify leash properties * Modify leash properties
* ---------------------- */ * ---------------------- */
boolean setMaxDistance(Entity holder, Double distance); boolean setMaxDistance(Entity holder, Double distance);
/**
* Sets max distance.
*
* @param holder the holder
* @param distance the distance
* @param maxKeepTicks the max keep ticks
* @return the max distance
*/
boolean setMaxDistance(Entity holder, Double distance, int maxKeepTicks); boolean setMaxDistance(Entity holder, Double distance, int maxKeepTicks);
/**
* Sets max distance.
*
* @param holder the holder
* @param distance the distance
* @param maxKeepTicks the max keep ticks
* @param reserved the reserved
* @return the max distance
*/
boolean setMaxDistance(Entity holder, Double distance, int maxKeepTicks, String reserved); boolean setMaxDistance(Entity holder, Double distance, int maxKeepTicks, String reserved);
/**
* Sets max distance.
*
* @param holderUUID the holder uuid
* @param distance the distance
* @return the max distance
*/
boolean setMaxDistance(UUID holderUUID, Double distance); boolean setMaxDistance(UUID holderUUID, Double distance);
/**
* Sets max distance.
*
* @param holderUUID the holder uuid
* @param distance the distance
* @param maxKeepTicks the max keep ticks
* @return the max distance
*/
boolean setMaxDistance(UUID holderUUID, Double distance, int maxKeepTicks); boolean setMaxDistance(UUID holderUUID, Double distance, int maxKeepTicks);
/**
* Sets max distance.
*
* @param holderUUID the holder uuid
* @param distance the distance
* @param maxKeepTicks the max keep ticks
* @param reserved the reserved
* @return the max distance
*/
boolean setMaxDistance(UUID holderUUID, Double distance, int maxKeepTicks, String reserved); boolean setMaxDistance(UUID holderUUID, Double distance, int maxKeepTicks, String reserved);
/**
* Sets max distance.
*
* @param knotPos the knot pos
* @param distance the distance
* @return the max distance
*/
boolean setMaxDistance(BlockPos knotPos, Double distance); boolean setMaxDistance(BlockPos knotPos, Double distance);
/**
* Sets max distance.
*
* @param knotPos the knot pos
* @param distance the distance
* @param maxKeepTicks the max keep ticks
* @return the max distance
*/
boolean setMaxDistance(BlockPos knotPos, Double distance, int maxKeepTicks); boolean setMaxDistance(BlockPos knotPos, Double distance, int maxKeepTicks);
/**
* Sets max distance.
*
* @param knotPos the knot pos
* @param distance the distance
* @param maxKeepTicks the max keep ticks
* @param reserved the reserved
* @return the max distance
*/
boolean setMaxDistance(BlockPos knotPos, Double distance, int maxKeepTicks, String reserved); boolean setMaxDistance(BlockPos knotPos, Double distance, int maxKeepTicks, String reserved);
/**
* Sets elastic distance scale.
*
* @param holder the holder
* @param scale the scale
* @return the elastic distance scale
*/
boolean setElasticDistanceScale(Entity holder, Double scale); boolean setElasticDistanceScale(Entity holder, Double scale);
/**
* Sets elastic distance scale.
*
* @param holder the holder
* @param scale the scale
* @param maxKeepTicks the max keep ticks
* @return the elastic distance scale
*/
boolean setElasticDistanceScale(Entity holder, Double scale, int maxKeepTicks); boolean setElasticDistanceScale(Entity holder, Double scale, int maxKeepTicks);
/**
* Sets elastic distance scale.
*
* @param holder the holder
* @param scale the scale
* @param maxKeepTicks the max keep ticks
* @param reserved the reserved
* @return the elastic distance scale
*/
boolean setElasticDistanceScale(Entity holder, Double scale, int maxKeepTicks, String reserved); boolean setElasticDistanceScale(Entity holder, Double scale, int maxKeepTicks, String reserved);
/**
* Sets elastic distance scale.
*
* @param holderUUID the holder uuid
* @param scale the scale
* @return the elastic distance scale
*/
boolean setElasticDistanceScale(UUID holderUUID, Double scale); boolean setElasticDistanceScale(UUID holderUUID, Double scale);
/**
* Sets elastic distance scale.
*
* @param holderUUID the holder uuid
* @param scale the scale
* @param maxKeepTicks the max keep ticks
* @return the elastic distance scale
*/
boolean setElasticDistanceScale(UUID holderUUID, Double scale, int maxKeepTicks); boolean setElasticDistanceScale(UUID holderUUID, Double scale, int maxKeepTicks);
/**
* Sets elastic distance scale.
*
* @param holderUUID the holder uuid
* @param scale the scale
* @param maxKeepTicks the max keep ticks
* @param reserved the reserved
* @return the elastic distance scale
*/
boolean setElasticDistanceScale(UUID holderUUID, Double scale, int maxKeepTicks, String reserved); boolean setElasticDistanceScale(UUID holderUUID, Double scale, int maxKeepTicks, String reserved);
/**
* Sets elastic distance scale.
*
* @param knotPos the knot pos
* @param scale the scale
* @return the elastic distance scale
*/
boolean setElasticDistanceScale(BlockPos knotPos, Double scale); boolean setElasticDistanceScale(BlockPos knotPos, Double scale);
/**
* Sets elastic distance scale.
*
* @param knotPos the knot pos
* @param scale the scale
* @param maxKeepTicks the max keep ticks
* @return the elastic distance scale
*/
boolean setElasticDistanceScale(BlockPos knotPos, Double scale, int maxKeepTicks); boolean setElasticDistanceScale(BlockPos knotPos, Double scale, int maxKeepTicks);
/**
* Sets elastic distance scale.
*
* @param knotPos the knot pos
* @param scale the scale
* @param maxKeepTicks the max keep ticks
* @param reserved the reserved
* @return the elastic distance scale
*/
boolean setElasticDistanceScale(BlockPos knotPos, Double scale, int maxKeepTicks, String reserved); boolean setElasticDistanceScale(BlockPos knotPos, Double scale, int maxKeepTicks, String reserved);
/**
* Apply leash forces.
*/
/* ---------------------- /* ----------------------
* Apply physics * Apply physics
* ---------------------- */ * ---------------------- */
void applyLeashForces(); void applyLeashForces();
/**
* Transfer leash boolean.
*
* @param holder the holder
* @param newHolder the new holder
* @return the boolean
*/
/* ---------------------- /* ----------------------
* Transfer leash holders * Transfer leash holders
* ---------------------- */ * ---------------------- */
boolean transferLeash(Entity holder, Entity newHolder); boolean transferLeash(Entity holder, Entity newHolder);
/**
* Transfer leash boolean.
*
* @param holder the holder
* @param newHolder the new holder
* @param reserved the reserved
* @return the boolean
*/
boolean transferLeash(Entity holder, Entity newHolder, String reserved); boolean transferLeash(Entity holder, Entity newHolder, String reserved);
/**
* Transfer leash boolean.
*
* @param holderUUID the holder uuid
* @param newHolder the new holder
* @return the boolean
*/
boolean transferLeash(UUID holderUUID, Entity newHolder); boolean transferLeash(UUID holderUUID, Entity newHolder);
/**
* Transfer leash boolean.
*
* @param holderUUID the holder uuid
* @param newHolder the new holder
* @param reserved the reserved
* @return the boolean
*/
boolean transferLeash(UUID holderUUID, Entity newHolder, String reserved); boolean transferLeash(UUID holderUUID, Entity newHolder, String reserved);
/**
* Transfer leash boolean.
*
* @param knotPos the knot pos
* @param newHolder the new holder
* @return the boolean
*/
boolean transferLeash(BlockPos knotPos, Entity newHolder); boolean transferLeash(BlockPos knotPos, Entity newHolder);
/**
* Transfer leash boolean.
*
* @param knotPos the knot pos
* @param newHolder the new holder
* @param reserved the reserved
* @return the boolean
*/
boolean transferLeash(BlockPos knotPos, Entity newHolder, String reserved); boolean transferLeash(BlockPos knotPos, Entity newHolder, String reserved);
/**
* Has leash boolean.
*
* @return the boolean
*/
/* ---------------------- /* ----------------------
* Query state * Query state
* ---------------------- */ * ---------------------- */
boolean hasLeash(); boolean hasLeash();
/**
* Has knot leash boolean.
*
* @return the boolean
*/
boolean hasKnotLeash(); boolean hasKnotLeash();
/**
* Has holder leash boolean.
*
* @return the boolean
*/
boolean hasHolderLeash(); boolean hasHolderLeash();
/**
* Gets all leashes.
*
* @return the all leashes
*/
Collection<LeashInfo> getAllLeashes(); Collection<LeashInfo> getAllLeashes();
/**
* Is leashed by boolean.
*
* @param holder the holder
* @return the boolean
*/
boolean isLeashedBy(Entity holder); boolean isLeashedBy(Entity holder);
/**
* Is leashed by boolean.
*
* @param holderUUID the holder uuid
* @return the boolean
*/
boolean isLeashedBy(UUID holderUUID); boolean isLeashedBy(UUID holderUUID);
/**
* Is leashed by boolean.
*
* @param knotPos the knot pos
* @return the boolean
*/
boolean isLeashedBy(BlockPos knotPos); boolean isLeashedBy(BlockPos knotPos);
/**
* Is in delayed leash boolean.
*
* @param holderUUID the holder uuid
* @return the boolean
*/
boolean isInDelayedLeash(UUID holderUUID); boolean isInDelayedLeash(UUID holderUUID);
/**
* Gets leash info.
*
* @param holder the holder
* @return the leash info
*/
Optional<LeashInfo> getLeashInfo(Entity holder); Optional<LeashInfo> getLeashInfo(Entity holder);
/**
* Gets leash info.
*
* @param holderUUID the holder uuid
* @return the leash info
*/
Optional<LeashInfo> getLeashInfo(UUID holderUUID); Optional<LeashInfo> getLeashInfo(UUID holderUUID);
/**
* Gets leash info.
*
* @param knotPos the knot pos
* @return the leash info
*/
Optional<LeashInfo> getLeashInfo(BlockPos knotPos); Optional<LeashInfo> getLeashInfo(BlockPos knotPos);
/**
* Can be leashed boolean.
*
* @return the boolean
*/
boolean canBeLeashed(); boolean canBeLeashed();
/**
* Can be attached to boolean.
*
* @param entity the entity
* @return the boolean
*/
boolean canBeAttachedTo(Entity entity); boolean canBeAttachedTo(Entity entity);
/* ---------------------- /* ----------------------
* Occupy / sync * Occupy / sync
* ---------------------- */ * ---------------------- */
/** /**
* 抢占位已离线玩家 * 抢占位已离线玩家
* 用于解决玩家下线后所持有对象会移除持有者的问题实际上是占用个弱集合 * 用于解决玩家下线后所持有对象会移除持有者的问题实际上是占用个弱集合
*
* @return the optional
*/ */
Optional<UUID> occupyLeash(); Optional<UUID> occupyLeash();
/**
* Mark for sync.
*/
void markForSync(); void markForSync();
/**
* Immediate sync.
*/
void immediateSync(); void immediateSync();
/**
* Check sync.
*/
void checkSync(); void checkSync();
} }

View File

@ -27,77 +27,283 @@ import org.jetbrains.annotations.Nullable;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
/** /**
* Capability interface for managing leash states of entities and knots. * Capability interface for managing leash states of entities and knots.
*/ */
public interface ILeashState extends INBTSerializable<CompoundTag> { public interface ILeashState extends INBTSerializable<CompoundTag> {
/**
* Self entity.
*
* @return the entity
*/
Entity self();
/**
* Has leash state boolean.
*
* @return the boolean
*/
/* ---------------------- /* ----------------------
* Query leash states * Query leash states
* ---------------------- */ * ---------------------- */
boolean hasLeashState(); boolean hasLeashState();
/**
* Gets holder leash states.
*
* @return the holder leash states
*/
Map<UUID, LeashState> getHolderLeashStates(); Map<UUID, LeashState> getHolderLeashStates();
/**
* Gets knot leash states.
*
* @return the knot leash states
*/
Map<BlockPos, LeashState> getKnotLeashStates(); Map<BlockPos, LeashState> getKnotLeashStates();
/**
* Gets leash state.
*
* @param entity the entity
* @return the leash state
*/
Optional<LeashState> getLeashState(Entity entity); Optional<LeashState> getLeashState(Entity entity);
/**
* Gets leash state.
*
* @param uuid the uuid
* @return the leash state
*/
Optional<LeashState> getLeashState(UUID uuid); Optional<LeashState> getLeashState(UUID uuid);
/**
* Gets leash state.
*
* @param pos the pos
* @return the leash state
*/
Optional<LeashState> getLeashState(BlockPos pos); Optional<LeashState> getLeashState(BlockPos pos);
/**
* Gets holder location offset.
*
* @param entity the entity
* @return the holder location offset
*/
/* ---------------------- /* ----------------------
* Get offsets * Get offsets
* ---------------------- */ * ---------------------- */
Optional<Vec3> getHolderLocationOffset(Entity entity); Optional<Vec3> getHolderLocationOffset(Entity entity);
/**
* Gets holder location offset.
*
* @param uuid the uuid
* @return the holder location offset
*/
Optional<Vec3> getHolderLocationOffset(UUID uuid); Optional<Vec3> getHolderLocationOffset(UUID uuid);
/**
* Gets holder location offset.
*
* @param pos the pos
* @return the holder location offset
*/
Optional<Vec3> getHolderLocationOffset(BlockPos pos); Optional<Vec3> getHolderLocationOffset(BlockPos pos);
/**
* Gets leash apply entity location offset.
*
* @return the leash apply entity location offset
*/
Optional<Vec3> getLeashApplyEntityLocationOffset(); Optional<Vec3> getLeashApplyEntityLocationOffset();
/**
* Gets default leash apply entity location offset.
*
* @return the default leash apply entity location offset
*/
Vec3 getDefaultLeashApplyEntityLocationOffset(); Vec3 getDefaultLeashApplyEntityLocationOffset();
/**
* Reset all leash apply entity locations offset.
*/
/* ---------------------- /* ----------------------
* Reset offsets (setApplyEntity null) * Reset offsets (setApplyEntity null)
* ---------------------- */ * ---------------------- */
void resetAllLeashApplyEntityLocationsOffset(); void resetAllLeashApplyEntityLocationsOffset();
/**
* Reset all leash holder locations offset.
*/
void resetAllLeashHolderLocationsOffset(); void resetAllLeashHolderLocationsOffset();
/**
* Reset leash holder location offset.
*
* @param holder the holder
*/
void resetLeashHolderLocationOffset(Entity holder); void resetLeashHolderLocationOffset(Entity holder);
/**
* Reset leash holder location offset.
*
* @param holderUUID the holder uuid
*/
void resetLeashHolderLocationOffset(UUID holderUUID); void resetLeashHolderLocationOffset(UUID holderUUID);
/**
* Reset leash holder location offset.
*
* @param knotPos the knot pos
*/
void resetLeashHolderLocationOffset(BlockPos knotPos); void resetLeashHolderLocationOffset(BlockPos knotPos);
/**
* Sets leash holder location offset.
*
* @param holder the holder
* @param offset the offset
*/
/* ---------------------- /* ----------------------
* Set offsets (can setApplyEntity null) * Set offsets (can setApplyEntity null)
* ---------------------- */ * ---------------------- */
void setLeashHolderLocationOffset(Entity holder,@Nullable Vec3 offset); void setLeashHolderLocationOffset(Entity holder,@Nullable Vec3 offset);
/**
* Sets leash holder location offset.
*
* @param holderUUID the holder uuid
* @param offset the offset
*/
void setLeashHolderLocationOffset(UUID holderUUID,@Nullable Vec3 offset); void setLeashHolderLocationOffset(UUID holderUUID,@Nullable Vec3 offset);
/**
* Sets leash holder location offset.
*
* @param knotPos the knot pos
* @param offset the offset
*/
void setLeashHolderLocationOffset(BlockPos knotPos,@Nullable Vec3 offset); void setLeashHolderLocationOffset(BlockPos knotPos,@Nullable Vec3 offset);
/**
* Sets leash apply entity location offset.
*
* @param offset the offset
*/
void setLeashApplyEntityLocationOffset(Vec3 offset); void setLeashApplyEntityLocationOffset(Vec3 offset);
/**
* Add leash holder location offset.
*
* @param holder the holder
* @param offset the offset
*/
/* ---------------------- /* ----------------------
* Add offsets * Add offsets
* ---------------------- */ * ---------------------- */
void addLeashHolderLocationOffset(Entity holder, Vec3 offset); void addLeashHolderLocationOffset(Entity holder, Vec3 offset);
/**
* Add leash holder location offset.
*
* @param holderUUID the holder uuid
* @param offset the offset
*/
void addLeashHolderLocationOffset(UUID holderUUID, Vec3 offset); void addLeashHolderLocationOffset(UUID holderUUID, Vec3 offset);
/**
* Add leash holder location offset.
*
* @param knotPos the knot pos
* @param offset the offset
*/
void addLeashHolderLocationOffset(BlockPos knotPos, Vec3 offset); void addLeashHolderLocationOffset(BlockPos knotPos, Vec3 offset);
/**
* Add leash apply entity location offset.
*
* @param offset the offset
*/
void addLeashApplyEntityLocationOffset(Vec3 offset); void addLeashApplyEntityLocationOffset(Vec3 offset);
/**
* Remove leash holder location offset.
*
* @param holder the holder
*/
/* ---------------------- /* ----------------------
* Remove offsets (delete) * Remove offsets (delete)
* ---------------------- */ * ---------------------- */
void removeLeashHolderLocationOffset(Entity holder); void removeLeashHolderLocationOffset(Entity holder);
/**
* Remove leash holder location offset.
*
* @param holderUUID the holder uuid
*/
void removeLeashHolderLocationOffset(UUID holderUUID); void removeLeashHolderLocationOffset(UUID holderUUID);
/**
* Remove leash holder location offset.
*
* @param knotPos the knot pos
*/
void removeLeashHolderLocationOffset(BlockPos knotPos); void removeLeashHolderLocationOffset(BlockPos knotPos);
/**
* Remove all leash holder location offset.
*/
void removeAllLeashHolderLocationOffset(); void removeAllLeashHolderLocationOffset();
/**
* Remove all leash holder uuid location offset.
*/
void removeAllLeashHolderUUIDLocationOffset(); void removeAllLeashHolderUUIDLocationOffset();
/**
* Remove all leash holder block pos location offset.
*/
void removeAllLeashHolderBlockPosLocationOffset(); void removeAllLeashHolderBlockPosLocationOffset();
/**
* Remove leash apply entity location offset.
*/
void removeLeashApplyEntityLocationOffset(); void removeLeashApplyEntityLocationOffset();
/**
* Copy.
*
* @param other the other
* @param newEntity the new entity
*/
/* ---------------------- /* ----------------------
* Utility & sync * Utility & sync
* ---------------------- */ * ---------------------- */
void copy(ILeashState other, Entity newEntity); void copy(ILeashState other, Entity newEntity);
/**
* Mark for sync.
*/
void markForSync(); void markForSync();
/**
* Immediate sync.
*/
void immediateSync(); void immediateSync();
/**
* Check sync.
*/
void checkSync(); void checkSync();
/**
* The type Leash state.
*/
/* ---------------------- /* ----------------------
* Data record * Data record
* ---------------------- */ * ---------------------- */
@ -106,21 +312,44 @@ public interface ILeashState extends INBTSerializable<CompoundTag> {
Vec3 applyEntityLocationOffset, Vec3 applyEntityLocationOffset,
Vec3 defaultHolderLocationOffset Vec3 defaultHolderLocationOffset
) { ) {
/**
* Reset holder location offset leash state.
*
* @return the leash state
*/
@Contract(" -> new") @Contract(" -> new")
public @NotNull LeashState resetHolderLocationOffset() { public @NotNull LeashState resetHolderLocationOffset() {
return new LeashState(null, applyEntityLocationOffset, defaultHolderLocationOffset); return new LeashState(null, applyEntityLocationOffset, defaultHolderLocationOffset);
} }
/**
* Sets holder location offset.
*
* @param holderLocationOffset the holder location offset
* @return the holder location offset
*/
@Contract("_ -> new") @Contract("_ -> new")
public @NotNull LeashState setHolderLocationOffset(@Nullable Vec3 holderLocationOffset) { public @NotNull LeashState setHolderLocationOffset(@Nullable Vec3 holderLocationOffset) {
return new LeashState(holderLocationOffset, applyEntityLocationOffset, defaultHolderLocationOffset); return new LeashState(holderLocationOffset, applyEntityLocationOffset, defaultHolderLocationOffset);
} }
/**
* Sets apply entity location offset.
*
* @param applyEntityLocationOffset the apply entity location offset
* @return the apply entity location offset
*/
@Contract("_ -> new") @Contract("_ -> new")
public @NotNull LeashState setApplyEntityLocationOffset(@NotNull Vec3 applyEntityLocationOffset) { public @NotNull LeashState setApplyEntityLocationOffset(@NotNull Vec3 applyEntityLocationOffset) {
return new LeashState(holderLocationOffset, applyEntityLocationOffset, defaultHolderLocationOffset); return new LeashState(holderLocationOffset, applyEntityLocationOffset, defaultHolderLocationOffset);
} }
/**
* Sets default holder location offset.
*
* @param defaultHolderLocationOffset the default holder location offset
* @return the default holder location offset
*/
@Contract("_ -> new") @Contract("_ -> new")
public @NotNull LeashState setDefaultHolderLocationOffset(@NotNull Vec3 defaultHolderLocationOffset) { public @NotNull LeashState setDefaultHolderLocationOffset(@NotNull Vec3 defaultHolderLocationOffset) {
return new LeashState(holderLocationOffset, applyEntityLocationOffset, defaultHolderLocationOffset); return new LeashState(holderLocationOffset, applyEntityLocationOffset, defaultHolderLocationOffset);

View File

@ -20,10 +20,24 @@ import org.jetbrains.annotations.Nullable;
import java.util.UUID; import java.util.UUID;
/**
* The type Leash holder.
*/
public record LeashHolder(@Nullable UUID holderUUID, @Nullable BlockPos knotPos, boolean isKnot) { public record LeashHolder(@Nullable UUID holderUUID, @Nullable BlockPos knotPos, boolean isKnot) {
/**
* Instantiates a new Leash holder.
*
* @param holderUUID the holder uuid
*/
public LeashHolder(UUID holderUUID) { public LeashHolder(UUID holderUUID) {
this (holderUUID, null, false); this (holderUUID, null, false);
} }
/**
* Instantiates a new Leash holder.
*
* @param knotPos the knot pos
*/
public LeashHolder(BlockPos knotPos) { public LeashHolder(BlockPos knotPos) {
this(null, knotPos, true); this(null, knotPos, true);
} }

View File

@ -24,6 +24,9 @@ import top.r3944realms.superleadrope.api.SuperLeadRopeApi;
import java.util.*; import java.util.*;
/**
* The type Leash info.
*/
/* ---------------------- /* ----------------------
* Data record * Data record
* ---------------------- */ * ---------------------- */
@ -39,16 +42,40 @@ public record LeashInfo(
int keepLeashTicks, // 剩余 Tick int keepLeashTicks, // 剩余 Tick
int maxKeepLeashTicks // 最大保持 Tick int maxKeepLeashTicks // 最大保持 Tick
) { ) {
// 预定义的标记常量 /**
* The constant MARK_NOT_UPDATE.
*/
// 预定义的标记常量
public static final String MARK_NOT_UPDATE = "NOT_UPDATE"; public static final String MARK_NOT_UPDATE = "NOT_UPDATE";
/**
* The constant MARK_ONLY_NOT_UPDATE_MAX_DISTANCE.
*/
public static final String MARK_ONLY_NOT_UPDATE_MAX_DISTANCE = "NOT_UPDATE_MAX_DISTANCE"; public static final String MARK_ONLY_NOT_UPDATE_MAX_DISTANCE = "NOT_UPDATE_MAX_DISTANCE";
/**
* The constant MARK_ONLY_NOT_UPDATE_ELASTIC_DISTANCE_SCALE.
*/
public static final String MARK_ONLY_NOT_UPDATE_ELASTIC_DISTANCE_SCALE = "NOT_UPDATE_ELASTIC_DISTANCE_SCALE"; public static final String MARK_ONLY_NOT_UPDATE_ELASTIC_DISTANCE_SCALE = "NOT_UPDATE_ELASTIC_DISTANCE_SCALE";
/**
* The constant EMPTY.
*/
public static final LeashInfo EMPTY = new LeashInfo( public static final LeashInfo EMPTY = new LeashInfo(
Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(),
Set.of(), "", 12.0D, 6.0D, 0, 0 Set.of(), "", 12.0D, 6.0D, 0, 0
); );
/**
* Create leash info.
*
* @param entity the entity
* @param marks the marks
* @param reserved the reserved
* @param maxDistance the max distance
* @param elasticDistanceScale the elastic distance scale
* @param keepTicks the keep ticks
* @param maxKeepTicks the max keep ticks
* @return the leash info
*/
/* ---------- Factory ---------- */ /* ---------- Factory ---------- */
public static LeashInfo create( public static LeashInfo create(
Entity entity, Entity entity,
@ -65,7 +92,18 @@ public record LeashInfo(
: new LeashInfo(entity.getUUID(), entity.getId(), marks, reserved, maxDistance, elasticDistanceScale, keepTicks, maxKeepTicks); : new LeashInfo(entity.getUUID(), entity.getId(), marks, reserved, maxDistance, elasticDistanceScale, keepTicks, maxKeepTicks);
} }
// 向后兼容的工厂方法 /**
* Create leash info.
*
* @param entity the entity
* @param reserved the reserved
* @param maxDistance the max distance
* @param elasticDistanceScale the elastic distance scale
* @param keepTicks the keep ticks
* @param maxKeepTicks the max keep ticks
* @return the leash info
*/
// 向后兼容的工厂方法
public static LeashInfo create( public static LeashInfo create(
Entity entity, Entity entity,
String reserved, String reserved,
@ -77,30 +115,81 @@ public record LeashInfo(
return create(entity, Set.of(), reserved, maxDistance, elasticDistanceScale, keepTicks, maxKeepTicks); return create(entity, Set.of(), reserved, maxDistance, elasticDistanceScale, keepTicks, maxKeepTicks);
} }
/**
* Instantiates a new Leash info.
*
* @param holderUUID the holder uuid
* @param holderId the holder id
* @param reserved the reserved
* @param maxDistance the max distance
* @param elasticDistanceScale the elastic distance scale
* @param keepTicks the keep ticks
* @param maxKeepTicks the max keep ticks
*/
public LeashInfo(UUID holderUUID, int holderId, String reserved, public LeashInfo(UUID holderUUID, int holderId, String reserved,
Double maxDistance, Double elasticDistanceScale, int keepTicks, int maxKeepTicks) { Double maxDistance, Double elasticDistanceScale, int keepTicks, int maxKeepTicks) {
this(Optional.empty(), Optional.of(holderUUID), Optional.of(holderId), this(Optional.empty(), Optional.of(holderUUID), Optional.of(holderId),
Set.of(), reserved, maxDistance, elasticDistanceScale, keepTicks, maxKeepTicks); Set.of(), reserved, maxDistance, elasticDistanceScale, keepTicks, maxKeepTicks);
} }
/**
* Instantiates a new Leash info.
*
* @param holderUUID the holder uuid
* @param holderId the holder id
* @param marks the marks
* @param reserved the reserved
* @param maxDistance the max distance
* @param elasticDistanceScale the elastic distance scale
* @param keepTicks the keep ticks
* @param maxKeepTicks the max keep ticks
*/
public LeashInfo(UUID holderUUID, int holderId, Set<String> marks, String reserved, public LeashInfo(UUID holderUUID, int holderId, Set<String> marks, String reserved,
Double maxDistance, Double elasticDistanceScale, int keepTicks, int maxKeepTicks) { Double maxDistance, Double elasticDistanceScale, int keepTicks, int maxKeepTicks) {
this(Optional.empty(), Optional.of(holderUUID), Optional.of(holderId), this(Optional.empty(), Optional.of(holderUUID), Optional.of(holderId),
marks, reserved, maxDistance, elasticDistanceScale, keepTicks, maxKeepTicks); marks, reserved, maxDistance, elasticDistanceScale, keepTicks, maxKeepTicks);
} }
/**
* Instantiates a new Leash info.
*
* @param knotPos the knot pos
* @param holderId the holder id
* @param reserved the reserved
* @param maxDistance the max distance
* @param elasticDistanceScale the elastic distance scale
* @param keepTicks the keep ticks
* @param maxKeepTicks the max keep ticks
*/
public LeashInfo(BlockPos knotPos, int holderId, String reserved, public LeashInfo(BlockPos knotPos, int holderId, String reserved,
Double maxDistance, Double elasticDistanceScale, int keepTicks, int maxKeepTicks) { Double maxDistance, Double elasticDistanceScale, int keepTicks, int maxKeepTicks) {
this(Optional.of(knotPos), Optional.empty(), Optional.of(holderId), this(Optional.of(knotPos), Optional.empty(), Optional.of(holderId),
Set.of(), reserved, maxDistance, elasticDistanceScale, keepTicks, maxKeepTicks); Set.of(), reserved, maxDistance, elasticDistanceScale, keepTicks, maxKeepTicks);
} }
/**
* Instantiates a new Leash info.
*
* @param knotPos the knot pos
* @param holderId the holder id
* @param marks the marks
* @param reserved the reserved
* @param maxDistance the max distance
* @param elasticDistanceScale the elastic distance scale
* @param keepTicks the keep ticks
* @param maxKeepTicks the max keep ticks
*/
public LeashInfo(BlockPos knotPos, int holderId, Set<String> marks, String reserved, public LeashInfo(BlockPos knotPos, int holderId, Set<String> marks, String reserved,
Double maxDistance, Double elasticDistanceScale, int keepTicks, int maxKeepTicks) { Double maxDistance, Double elasticDistanceScale, int keepTicks, int maxKeepTicks) {
this(Optional.of(knotPos), Optional.empty(), Optional.of(holderId), this(Optional.of(knotPos), Optional.empty(), Optional.of(holderId),
marks, reserved, maxDistance, elasticDistanceScale, keepTicks, maxKeepTicks); marks, reserved, maxDistance, elasticDistanceScale, keepTicks, maxKeepTicks);
} }
/**
* Decrement keep ticks leash info.
*
* @return the leash info
*/
/* ---------- State updates ---------- */ /* ---------- State updates ---------- */
public LeashInfo decrementKeepTicks() { public LeashInfo decrementKeepTicks() {
return new LeashInfo(blockPosOpt, holderUUIDOpt, holderIdOpt, marks, reserved, return new LeashInfo(blockPosOpt, holderUUIDOpt, holderIdOpt, marks, reserved,
@ -108,16 +197,34 @@ public record LeashInfo(
Math.max(0, keepLeashTicks - 1), maxKeepLeashTicks); Math.max(0, keepLeashTicks - 1), maxKeepLeashTicks);
} }
/**
* Reset keep ticks leash info.
*
* @return the leash info
*/
public LeashInfo resetKeepTicks() { public LeashInfo resetKeepTicks() {
return new LeashInfo(blockPosOpt, holderUUIDOpt, holderIdOpt, marks, reserved, return new LeashInfo(blockPosOpt, holderUUIDOpt, holderIdOpt, marks, reserved,
maxDistance, elasticDistanceScale, maxDistance, elasticDistanceScale,
maxKeepLeashTicks, maxKeepLeashTicks); maxKeepLeashTicks, maxKeepLeashTicks);
} }
/**
* Transfer holder leash info.
*
* @param entity the entity
* @return the leash info
*/
public LeashInfo transferHolder(Entity entity) { public LeashInfo transferHolder(Entity entity) {
return transferHolder(entity, reserved); return transferHolder(entity, reserved);
} }
/**
* Transfer holder leash info.
*
* @param entity the entity
* @param newReserved the new reserved
* @return the leash info
*/
public LeashInfo transferHolder(Entity entity, String newReserved) { public LeashInfo transferHolder(Entity entity, String newReserved) {
boolean isKnot = SuperLeadRopeApi.isSuperLeadKnot(entity); boolean isKnot = SuperLeadRopeApi.isSuperLeadKnot(entity);
return new LeashInfo( return new LeashInfo(
@ -131,6 +238,9 @@ public record LeashInfo(
/** /**
* 修改保留字段 * 修改保留字段
*
* @param newReserved the new reserved
* @return the leash info
*/ */
public LeashInfo withReserved(String newReserved) { public LeashInfo withReserved(String newReserved) {
return new LeashInfo(blockPosOpt, holderUUIDOpt, holderIdOpt, marks, newReserved, return new LeashInfo(blockPosOpt, holderUUIDOpt, holderIdOpt, marks, newReserved,
@ -139,6 +249,9 @@ public record LeashInfo(
/** /**
* 修改标记集合 * 修改标记集合
*
* @param newMarks the new marks
* @return the leash info
*/ */
public LeashInfo withMarks(Set<String> newMarks) { public LeashInfo withMarks(Set<String> newMarks) {
return new LeashInfo(blockPosOpt, holderUUIDOpt, holderIdOpt, Set.copyOf(newMarks), reserved, return new LeashInfo(blockPosOpt, holderUUIDOpt, holderIdOpt, Set.copyOf(newMarks), reserved,
@ -149,11 +262,18 @@ public record LeashInfo(
/** /**
* 添加无需更新标记如果不存在则添加 * 添加无需更新标记如果不存在则添加
*
* @return the leash info
*/ */
public LeashInfo markNotUpdate() { public LeashInfo markNotUpdate() {
return hasMark(MARK_NOT_UPDATE) ? this : addMark(MARK_NOT_UPDATE); return hasMark(MARK_NOT_UPDATE) ? this : addMark(MARK_NOT_UPDATE);
} }
/**
* Mark not update distance leash info.
*
* @return the leash info
*/
public LeashInfo markNotUpdateDistance() { public LeashInfo markNotUpdateDistance() {
if (hasMark(MARK_NOT_UPDATE)) { if (hasMark(MARK_NOT_UPDATE)) {
return this; return this;
@ -167,6 +287,11 @@ public record LeashInfo(
return this.addMark(MARK_ONLY_NOT_UPDATE_MAX_DISTANCE); return this.addMark(MARK_ONLY_NOT_UPDATE_MAX_DISTANCE);
} }
/**
* Mark not update scale leash info.
*
* @return the leash info
*/
public LeashInfo markNotUpdateScale() { public LeashInfo markNotUpdateScale() {
if (hasMark(MARK_NOT_UPDATE)) { if (hasMark(MARK_NOT_UPDATE)) {
return this; return this;
@ -182,6 +307,8 @@ public record LeashInfo(
/** /**
* 移除无需更新标记 * 移除无需更新标记
*
* @return the leash info
*/ */
public LeashInfo unmarkNotUpdate() { public LeashInfo unmarkNotUpdate() {
return removeMarks(MARK_NOT_UPDATE, MARK_ONLY_NOT_UPDATE_MAX_DISTANCE, MARK_ONLY_NOT_UPDATE_ELASTIC_DISTANCE_SCALE); return removeMarks(MARK_NOT_UPDATE, MARK_ONLY_NOT_UPDATE_MAX_DISTANCE, MARK_ONLY_NOT_UPDATE_ELASTIC_DISTANCE_SCALE);
@ -189,6 +316,8 @@ public record LeashInfo(
/** /**
* 移除无需更新距离标记 * 移除无需更新距离标记
*
* @return the leash info
*/ */
public LeashInfo unmarkNotUpdateDistance() { public LeashInfo unmarkNotUpdateDistance() {
return removeMarks(MARK_NOT_UPDATE, MARK_ONLY_NOT_UPDATE_MAX_DISTANCE); return removeMarks(MARK_NOT_UPDATE, MARK_ONLY_NOT_UPDATE_MAX_DISTANCE);
@ -196,6 +325,8 @@ public record LeashInfo(
/** /**
* 移除无需更新比例标记 * 移除无需更新比例标记
*
* @return the leash info
*/ */
public LeashInfo unmarkNotUpdateScale() { public LeashInfo unmarkNotUpdateScale() {
return removeMarks(MARK_NOT_UPDATE, MARK_ONLY_NOT_UPDATE_ELASTIC_DISTANCE_SCALE); return removeMarks(MARK_NOT_UPDATE, MARK_ONLY_NOT_UPDATE_ELASTIC_DISTANCE_SCALE);
@ -203,6 +334,8 @@ public record LeashInfo(
/** /**
* 检查是否包含无需更新标记 * 检查是否包含无需更新标记
*
* @return the boolean
*/ */
@SuppressWarnings("BooleanMethodIsAlwaysInverted") @SuppressWarnings("BooleanMethodIsAlwaysInverted")
public boolean isNotUpdate() { public boolean isNotUpdate() {
@ -211,6 +344,8 @@ public record LeashInfo(
/** /**
* 是否需距离更新标记 * 是否需距离更新标记
*
* @return the boolean
*/ */
public boolean isNeedUpdateDistance() { public boolean isNeedUpdateDistance() {
return !isNotUpdate() && !hasMark(MARK_ONLY_NOT_UPDATE_MAX_DISTANCE); return !isNotUpdate() && !hasMark(MARK_ONLY_NOT_UPDATE_MAX_DISTANCE);
@ -218,6 +353,8 @@ public record LeashInfo(
/** /**
* 是否需比例更新 * 是否需比例更新
*
* @return the boolean
*/ */
public boolean isNeedUpdateScale() { public boolean isNeedUpdateScale() {
return !isNotUpdate() && !hasMark(MARK_ONLY_NOT_UPDATE_ELASTIC_DISTANCE_SCALE); return !isNotUpdate() && !hasMark(MARK_ONLY_NOT_UPDATE_ELASTIC_DISTANCE_SCALE);
@ -225,6 +362,9 @@ public record LeashInfo(
/** /**
* 添加标记如果不存在则添加 * 添加标记如果不存在则添加
*
* @param mark the mark
* @return the leash info
*/ */
public LeashInfo addMark(String mark) { public LeashInfo addMark(String mark) {
if (marks.contains(mark)) { if (marks.contains(mark)) {
@ -238,6 +378,9 @@ public record LeashInfo(
/** /**
* 添加多个标记自动检测并跳过重复标记 * 添加多个标记自动检测并跳过重复标记
*
* @param marksToAdd the marks to add
* @return the leash info
*/ */
public LeashInfo addMarks(String @NotNull ... marksToAdd) { public LeashInfo addMarks(String @NotNull ... marksToAdd) {
Set<String> newMarks = new HashSet<>(marks); Set<String> newMarks = new HashSet<>(marks);
@ -253,6 +396,9 @@ public record LeashInfo(
/** /**
* 添加多个标记集合版本 * 添加多个标记集合版本
*
* @param marksToAdd the marks to add
* @return the leash info
*/ */
public LeashInfo addMarks(@NotNull Collection<String> marksToAdd) { public LeashInfo addMarks(@NotNull Collection<String> marksToAdd) {
return addMarks(marksToAdd.toArray(new String[0])); return addMarks(marksToAdd.toArray(new String[0]));
@ -260,6 +406,9 @@ public record LeashInfo(
/** /**
* 移除单个标记 * 移除单个标记
*
* @param mark the mark
* @return the leash info
*/ */
public LeashInfo removeMark(String mark) { public LeashInfo removeMark(String mark) {
if (!marks.contains(mark)) { if (!marks.contains(mark)) {
@ -273,6 +422,9 @@ public record LeashInfo(
/** /**
* 移除多个标记 * 移除多个标记
*
* @param marksToRemove the marks to remove
* @return the leash info
*/ */
public LeashInfo removeMarks(String @NotNull ... marksToRemove) { public LeashInfo removeMarks(String @NotNull ... marksToRemove) {
Set<String> newMarks = new HashSet<>(marks); Set<String> newMarks = new HashSet<>(marks);
@ -288,6 +440,9 @@ public record LeashInfo(
/** /**
* 移除多个标记集合版本 * 移除多个标记集合版本
*
* @param marksToRemove the marks to remove
* @return the leash info
*/ */
public LeashInfo removeMarks(@NotNull Collection<String> marksToRemove) { public LeashInfo removeMarks(@NotNull Collection<String> marksToRemove) {
return removeMarks(marksToRemove.toArray(new String[0])); return removeMarks(marksToRemove.toArray(new String[0]));
@ -295,6 +450,9 @@ public record LeashInfo(
/** /**
* 检查是否包含指定标记 * 检查是否包含指定标记
*
* @param mark the mark
* @return the boolean
*/ */
public boolean hasMark(String mark) { public boolean hasMark(String mark) {
return marks.contains(mark); return marks.contains(mark);
@ -302,6 +460,9 @@ public record LeashInfo(
/** /**
* 检查是否包含所有指定标记 * 检查是否包含所有指定标记
*
* @param marksToCheck the marks to check
* @return the boolean
*/ */
@Contract(pure = true) @Contract(pure = true)
public boolean hasAllMarks(String @NotNull ... marksToCheck) { public boolean hasAllMarks(String @NotNull ... marksToCheck) {
@ -315,6 +476,9 @@ public record LeashInfo(
/** /**
* 检查是否包含任意指定标记 * 检查是否包含任意指定标记
*
* @param marksToCheck the marks to check
* @return the boolean
*/ */
@Contract(pure = true) @Contract(pure = true)
public boolean hasAnyMark(String @NotNull ... marksToCheck) { public boolean hasAnyMark(String @NotNull ... marksToCheck) {
@ -328,6 +492,8 @@ public record LeashInfo(
/** /**
* 获取所有标记不可修改的视图 * 获取所有标记不可修改的视图
*
* @return the marks
*/ */
@Contract(pure = true) @Contract(pure = true)
public @Unmodifiable Set<String> getMarks() { public @Unmodifiable Set<String> getMarks() {
@ -336,6 +502,8 @@ public record LeashInfo(
/** /**
* 清除所有标记 * 清除所有标记
*
* @return the leash info
*/ */
public LeashInfo clearAllMarks() { public LeashInfo clearAllMarks() {
if (marks.isEmpty()) { if (marks.isEmpty()) {

View File

@ -17,6 +17,8 @@ package top.r3944realms.superleadrope.api.type.util;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import top.r3944realms.superleadrope.api.SuperLeadRopeApi; import top.r3944realms.superleadrope.api.SuperLeadRopeApi;
import top.r3944realms.superleadrope.api.type.capabilty.ILeashData; import top.r3944realms.superleadrope.api.type.capabilty.ILeashData;
@ -25,62 +27,208 @@ import top.r3944realms.superleadrope.api.type.capabilty.LeashInfo;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.function.Predicate;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.stream.Collectors;
/**
* 拴绳数据Helper
*/
public interface ILeashHelper { public interface ILeashHelper {
/**
* 持有者角度Helper
*
* @param holder 持有者
* @return IHolder holder helper
*/
IHolder getHolderHelper(Entity holder); IHolder getHolderHelper(Entity holder);
/**
* Gets leashed helper.
*
* @param leashed the leashed
* @return the leashed helper
*/
ILeashed getLeashedHelper(Entity leashed); ILeashed getLeashedHelper(Entity leashed);
/**
* The interface Holder.
*/
interface IHolder { interface IHolder {
/**
* 获取持有者实体
*
* @return 持有者 holder entity
*/
Entity getHolderEntity(); Entity getHolderEntity();
/** /**
* 获取该实体持有的所有拴绳数据 * 获取该实体持有的所有实体的拴绳数据能力
*
* @return {@link Set<ILeashData> 持有的实体的拴绳数据能力集合}
*/ */
Set<ILeashData> getAllLeashData(); Set<ILeashData> getAllLeash();
/**
* 获取该实体持有的所有实体实例
*
* @return {@link Set<Entity> 持有的实体集合}
*/
default Set<Entity> getAllLeashedEntities() {
return getAllLeash().stream().map(ILeashData::self).collect(Collectors.toSet());
}
/**
* 获取该实体持有的指定实体实例
*
* @param clazz 实体类型
* @param box 搜索范围
* @param filter {@link Predicate<Entity> 实体过滤器}
*
* @return {@link Set<Entity> 持有的实体集合}
*/
default Set<Entity> getLeashEntities (Class<Entity> clazz, AABB box, Predicate<Entity> filter) {
return getLeash(clazz, box, filter).stream().map(ILeashData::self).collect(Collectors.toSet());
}
/**
* 获取该实体持有的符合条件实体的拴绳数据能力
*
* @param clazz 实体类型
* @param box 搜索范围
* @param filter {@link Predicate<Entity> 实体过滤器}
*
* @return {@link Set<ILeashData> 持有的实体的拴绳数据能力集合}
*/
Set<ILeashData> getLeash(Class<Entity> clazz, AABB box, Predicate<Entity> filter);
/**
* 获取该实体持有的符合条件实体实例
*
* @param clazz 实体类型
* @param fetchDistance 搜索范围(以实体为中心的正方体{@link AABB#ofSize(Vec3, double, double, double) 包围盒})
* @param filter {@link Predicate<Entity> 实体过滤器}
*
* @return {@link Set<Entity> 持有的实体实例}
*/
default Set<Entity> getLeashEntities (Class<Entity> clazz, double fetchDistance, Predicate<Entity> filter) {
return getLeash(clazz, fetchDistance, filter).stream().map(ILeashData::self).collect(Collectors.toSet());
}
/**
* 获取该实体持有的符合条件实体的拴绳数据能力
*
* @param clazz 实体类型
* @param fetchDistance 搜索范围(以实体为中心的正方体{@link AABB#ofSize(Vec3, double, double, double) 包围盒})
* @param filter {@link Predicate<Entity> 实体过滤器}
*
* @return {@link Set<ILeashData> 持有的实体的拴绳数据能力集合}
*/
default Set<ILeashData> getLeash(Class<Entity> clazz, double fetchDistance, Predicate<Entity> filter) {
return getLeash(clazz, AABB.ofSize(getHolderEntity().position(), fetchDistance, fetchDistance, fetchDistance), filter);
}
/**
* 获取该实体持有的符合条件实体实例
*
* @param clazz 实体类型
* @param filter {@link Predicate<Entity> 实体过滤器}
*
* @return {@link Set<Entity> 持有的实体实例}
*/
default Set<Entity> getLeashEntities (Class<Entity> clazz, Predicate<Entity> filter) {
return getLeash(clazz, filter).stream().map(ILeashData::self).collect(Collectors.toSet());
}
/**
* 获取该实体持有的符合条件实体的拴绳数据能力
*
* @param clazz 实体类型
* @param filter {@link Predicate<Entity> 实体过滤器}
*
* @return {@link Set<ILeashData> 持有的实体的拴绳数据能力集合}
*/
default Set<ILeashData> getLeash(Class<Entity> clazz, Predicate<Entity> filter) {
return getLeash(clazz, 1024D, filter);
}
/**
* 获取该实体持有的符合条件实体实例
*
* @param clazz 实体类型
*
* @return {@link Set<Entity> 持有的实体实例}
*/
default Set<Entity> getLeashEntities (Class<Entity> clazz) {
return getLeash(clazz).stream().map(ILeashData::self).collect(Collectors.toSet());
}
/**
* 获取该实体持有的符合条件实体的拴绳数据能力
*
* @param clazz 实体类型
*
* @return {@link Set<ILeashData> 持有的实体的拴绳数据能力集合}
*/
default Set<ILeashData> getLeash(Class<Entity> clazz) {
return getLeash(clazz, 1024D, null);
}
/** /**
* 获取该实体持有的拴绳数量 * 获取该实体持有的拴绳数量
*
* @return the leash count
*/ */
default int getLeashCount() { default int getLeashCount() {
return getAllLeashData().size(); return getAllLeash().size();
} }
/** /**
* 检查是否持有任何拴绳 * 检查是否持有任何拴绳
*/ */
default boolean hasLeashes() { default boolean hasLeashes() {
return !getAllLeashData().isEmpty(); return !getAllLeash().isEmpty();
} }
/** /**
* 释放所有持有的拴绳 * 释放所有持有的拴绳
*/ */
default void releaseAllLeashes() { default void releaseAllLeashes() {
getAllLeashData().forEach(i -> i.removeLeash(getHolderEntity())); getAllLeash().forEach(i -> i.removeLeash(getHolderEntity()));
} }
/** /**
* 检查是否持有特定实体的拴绳 * 检查是否持有特定实体的拴绳
*
* @param entity the entity
* @return the boolean
*/ */
default boolean isHoldingLeash(Entity entity) { default boolean isHoldingLeash(Entity entity) {
return getAllLeashData().stream().anyMatch(i -> i.isLeashedBy(entity)); return getAllLeash().stream().anyMatch(i -> i.isLeashedBy(entity));
} }
/** /**
* 检查是否持有特定实体的拴绳 * 检查是否持有特定实体的拴绳
*
* @param uuid the uuid
* @return the boolean
*/ */
default boolean isHoldingLeash(UUID uuid) { default boolean isHoldingLeash(UUID uuid) {
return getAllLeashData().stream().anyMatch(i -> i.isLeashedBy(uuid)); return getAllLeash().stream().anyMatch(i -> i.isLeashedBy(uuid));
} }
/** /**
* 检查是否持有特定实体的拴绳 * 检查是否持有特定实体的拴绳
*
* @param blockPos the block pos
* @return the boolean
*/ */
default boolean isHoldingLeash(BlockPos blockPos) { default boolean isHoldingLeash(BlockPos blockPos) {
return getAllLeashData().stream().anyMatch(i -> i.isLeashedBy(blockPos)); return getAllLeash().stream().anyMatch(i -> i.isLeashedBy(blockPos));
} }
/** /**
* 拴住另一个实体 * 拴住另一个实体
*
* @param target the target
* @return the boolean
*/ */
default boolean leashEntity(Entity target) { default boolean leashEntity(Entity target) {
if (SuperLeadRopeApi.isLeashable(target)) { if (SuperLeadRopeApi.isLeashable(target)) {
@ -90,9 +238,20 @@ public interface ILeashHelper {
} }
return false; return false;
} }
/**
* Leash entity boolean.
*
* @param uuid the uuid
* @return the boolean
*/
boolean leashEntity(UUID uuid); boolean leashEntity(UUID uuid);
/** /**
* 解拴另一个实体 * 解拴另一个实体
*
* @param target the target
* @return the boolean
*/ */
default boolean unleashEntity(Entity target) { default boolean unleashEntity(Entity target) {
if (SuperLeadRopeApi.isLeashable(target)) { if (SuperLeadRopeApi.isLeashable(target)) {
@ -102,65 +261,125 @@ public interface ILeashHelper {
} }
return false; return false;
} }
/**
* Unleash entity boolean.
*
* @param uuid the uuid
* @return the boolean
*/
boolean unleashEntity(UUID uuid); boolean unleashEntity(UUID uuid);
} }
/**
* The interface Leashed.
*/
interface ILeashed { interface ILeashed {
/** /**
* 获取该实体的拴绳数据 * 获取该实体的拴绳数据
*
* @return the leash data
*/ */
ILeashData getLeashData(); ILeashData getLeashData();
/** /**
* 绑定拴绳到实体 * 绑定拴绳到实体
*
* @param holder the holder
* @return the boolean
*/ */
default boolean attachLeash(Entity holder) { default boolean attachLeash(Entity holder) {
return getLeashData().addLeash(holder); return getLeashData().addLeash(holder);
} }
/** /**
* 绑定拴绳到实体 * 绑定拴绳到实体
*
* @param holder the holder
* @param reserved the reserved
* @return the boolean
*/ */
default boolean attachLeash(Entity holder, String reserved) { default boolean attachLeash(Entity holder, String reserved) {
return getLeashData().addLeash(holder, reserved); return getLeashData().addLeash(holder, reserved);
} }
/** /**
* 绑定拴绳并设置参数 * 绑定拴绳并设置参数
*
* @param holder the holder
* @param maxDistance the max distance
* @param elasticDistanceScale the elastic distance scale
* @return the boolean
*/ */
default boolean attachLeash(Entity holder, Double maxDistance, Double elasticDistanceScale) { default boolean attachLeash(Entity holder, Double maxDistance, Double elasticDistanceScale) {
return getLeashData().addLeash(holder, maxDistance, elasticDistanceScale); return getLeashData().addLeash(holder, maxDistance, elasticDistanceScale);
} }
/** /**
* 绑定拴绳并设置参数 * 绑定拴绳并设置参数
*
* @param holder the holder
* @param maxDistance the max distance
* @param elasticDistanceScale the elastic distance scale
* @param reserved the reserved
* @return the boolean
*/ */
default boolean attachLeash(Entity holder, Double maxDistance, Double elasticDistanceScale, String reserved) { default boolean attachLeash(Entity holder, Double maxDistance, Double elasticDistanceScale, String reserved) {
return getLeashData().addLeash(holder, maxDistance, elasticDistanceScale, reserved); return getLeashData().addLeash(holder, maxDistance, elasticDistanceScale, reserved);
} }
/** /**
* 绑定拴绳并设置参数 * 绑定拴绳并设置参数
*
* @param holder the holder
* @param maxDistance the max distance
* @param elasticDistanceScale the elastic distance scale
* @param maxKeepTicks the max keep ticks
* @return the boolean
*/ */
default boolean attachLeash(Entity holder, Double maxDistance, Double elasticDistanceScale, int maxKeepTicks) { default boolean attachLeash(Entity holder, Double maxDistance, Double elasticDistanceScale, int maxKeepTicks) {
return getLeashData().addLeash(holder, maxDistance, elasticDistanceScale, maxKeepTicks); return getLeashData().addLeash(holder, maxDistance, elasticDistanceScale, maxKeepTicks);
} }
/** /**
* 绑定拴绳并设置参数 * 绑定拴绳并设置参数
*
* @param holder the holder
* @param maxDistance the max distance
* @param elasticDistanceScale the elastic distance scale
* @param maxKeepTicks the max keep ticks
* @param reserved the reserved
* @return the boolean
*/ */
default boolean attachLeash(Entity holder, Double maxDistance, Double elasticDistanceScale, int maxKeepTicks, String reserved) { default boolean attachLeash(Entity holder, Double maxDistance, Double elasticDistanceScale, int maxKeepTicks, String reserved) {
return getLeashData().addLeash(holder, maxDistance, elasticDistanceScale, maxKeepTicks, reserved); return getLeashData().addLeash(holder, maxDistance, elasticDistanceScale, maxKeepTicks, reserved);
} }
/** /**
* 解绑拴绳自动判断类型 * 解绑拴绳自动判断类型
*
* @param entity the entity
* @return the boolean
*/ */
default boolean detachLeash(Entity entity) { default boolean detachLeash(Entity entity) {
return getLeashData().removeLeash(entity); return getLeashData().removeLeash(entity);
} }
/** /**
* 解绑拴绳 * 解绑拴绳
*
* @param uuid the uuid
* @return the boolean
*/ */
default boolean detachLeash(UUID uuid) { default boolean detachLeash(UUID uuid) {
return getLeashData().removeLeash(uuid); return getLeashData().removeLeash(uuid);
} }
/** /**
* 解绑拴绳 * 解绑拴绳
*
* @param blockPos the block pos
* @return the boolean
*/ */
default boolean detachLeash(BlockPos blockPos) { default boolean detachLeash(BlockPos blockPos) {
return getLeashData().removeLeash(blockPos); return getLeashData().removeLeash(blockPos);
@ -172,38 +391,53 @@ public interface ILeashHelper {
default void detachAllLeashes() { default void detachAllLeashes() {
getLeashData().removeAllLeashes(); getLeashData().removeAllLeashes();
} }
/** /**
* 解绑所有实体拴绳 * 解绑所有实体拴绳
*/ */
default void removeAllHolderLeashes() { default void removeAllHolderLeashes() {
getLeashData().removeAllHolderLeashes(); getLeashData().removeAllHolderLeashes();
} }
/** /**
* 解绑所有绳结拴绳 * 解绑所有绳结拴绳
*/ */
default void removeAllKnotLeashes() { default void removeAllKnotLeashes() {
getLeashData().removeAllKnotLeashes(); getLeashData().removeAllKnotLeashes();
} }
/** /**
* 检查是否被拴住 * 检查是否被拴住
*
* @return the boolean
*/ */
default boolean isLeashed() { default boolean isLeashed() {
return getLeashData().hasLeash(); return getLeashData().hasLeash();
} }
/** /**
* 检查是否被持有者拴住 * 检查是否被持有者拴住
*
* @return the boolean
*/ */
default boolean hasHolderLeashed() { default boolean hasHolderLeashed() {
return getLeashData().hasHolderLeash(); return getLeashData().hasHolderLeash();
} }
/** /**
* 检查是否被绳结拴住 * 检查是否被绳结拴住
*
* @return the boolean
*/ */
default boolean isKnotLeashed() { default boolean isKnotLeashed() {
return getLeashData().hasKnotLeash(); return getLeashData().hasKnotLeash();
} }
/** /**
* 检查是否被特定实体拴住自动判断类型 * 检查是否被特定实体拴住自动判断类型
*
* @param entity the entity
* @return the boolean
*/ */
default boolean isLeashedBy(Entity entity) { default boolean isLeashedBy(Entity entity) {
return getLeashData().isLeashedBy(entity); return getLeashData().isLeashedBy(entity);
@ -211,6 +445,9 @@ public interface ILeashHelper {
/** /**
* 检查是否被特定UUID实体拴住 * 检查是否被特定UUID实体拴住
*
* @param uuid the uuid
* @return the boolean
*/ */
default boolean isLeashedBy(UUID uuid) { default boolean isLeashedBy(UUID uuid) {
return getLeashData().isLeashedBy(uuid); return getLeashData().isLeashedBy(uuid);
@ -218,6 +455,9 @@ public interface ILeashHelper {
/** /**
* 检查是否被特定绳结实体拴住 * 检查是否被特定绳结实体拴住
*
* @param blockPos the block pos
* @return the boolean
*/ */
default boolean isLeashedBy(BlockPos blockPos) { default boolean isLeashedBy(BlockPos blockPos) {
return getLeashData().isLeashedBy(blockPos); return getLeashData().isLeashedBy(blockPos);
@ -225,58 +465,109 @@ public interface ILeashHelper {
/** /**
* 获取拴绳信息自动判断类型 * 获取拴绳信息自动判断类型
*
* @param entity the entity
* @return the leash info
*/ */
default Optional<LeashInfo> getLeashInfo(Entity entity) { default Optional<LeashInfo> getLeashInfo(Entity entity) {
return getLeashData().getLeashInfo(entity); return getLeashData().getLeashInfo(entity);
} }
/** /**
* 获取拴绳信息 * 获取拴绳信息
*
* @param holderUUID the holder uuid
* @return the leash info
*/ */
default Optional<LeashInfo> getLeashInfo(UUID holderUUID) { default Optional<LeashInfo> getLeashInfo(UUID holderUUID) {
return getLeashData().getLeashInfo(holderUUID); return getLeashData().getLeashInfo(holderUUID);
} }
/** /**
* 获取拴绳信息 * 获取拴绳信息
*
* @param knotPos the knot pos
* @return the leash info
*/ */
default Optional<LeashInfo> getLeashInfo(BlockPos knotPos) { default Optional<LeashInfo> getLeashInfo(BlockPos knotPos) {
return getLeashData().getLeashInfo(knotPos); return getLeashData().getLeashInfo(knotPos);
} }
/** /**
* 转移拴绳到新持有者自动判断类型 * 转移拴绳到新持有者自动判断类型
*
* @param fromEntity the from entity
* @param toEntity the to entity
* @return the boolean
*/ */
default boolean transferLeash(Entity fromEntity, Entity toEntity) { default boolean transferLeash(Entity fromEntity, Entity toEntity) {
return getLeashData().transferLeash(fromEntity, toEntity); return getLeashData().transferLeash(fromEntity, toEntity);
} }
/** /**
* 转移拴绳到新持有者自动判断类型 * 转移拴绳到新持有者自动判断类型
*
* @param fromEntity the from entity
* @param toEntity the to entity
* @param reserved the reserved
* @return the boolean
*/ */
default boolean transferLeash(Entity fromEntity, Entity toEntity, String reserved) { default boolean transferLeash(Entity fromEntity, Entity toEntity, String reserved) {
return getLeashData().transferLeash(fromEntity, toEntity, reserved); return getLeashData().transferLeash(fromEntity, toEntity, reserved);
} }
/** /**
* 转移拴绳到新持有者 * 转移拴绳到新持有者
*
* @param fromEntityUUID the from entity uuid
* @param toEntity the to entity
* @return the boolean
*/ */
default boolean transferLeash(UUID fromEntityUUID, Entity toEntity) { default boolean transferLeash(UUID fromEntityUUID, Entity toEntity) {
return getLeashData().transferLeash(fromEntityUUID, toEntity); return getLeashData().transferLeash(fromEntityUUID, toEntity);
} }
/** /**
* 转移拴绳到新持有者 * 转移拴绳到新持有者
*
* @param fromEntityUUID the from entity uuid
* @param toEntity the to entity
* @param reserved the reserved
* @return the boolean
*/ */
default boolean transferLeash(UUID fromEntityUUID, Entity toEntity, String reserved) { default boolean transferLeash(UUID fromEntityUUID, Entity toEntity, String reserved) {
return getLeashData().transferLeash(fromEntityUUID, toEntity, reserved); return getLeashData().transferLeash(fromEntityUUID, toEntity, reserved);
} }
/** /**
* 转移拴绳到新持有者 * 转移拴绳到新持有者
*
* @param fromKnotBlockPos the from knot block pos
* @param toEntity the to entity
* @return the boolean
*/ */
default boolean transferLeash(BlockPos fromKnotBlockPos, Entity toEntity) { default boolean transferLeash(BlockPos fromKnotBlockPos, Entity toEntity) {
return getLeashData().transferLeash(fromKnotBlockPos, toEntity); return getLeashData().transferLeash(fromKnotBlockPos, toEntity);
} }
/** /**
* 转移拴绳到新持有者 * 转移拴绳到新持有者
*
* @param fromKnotBlockPos the from knot block pos
* @param toEntity the to entity
* @param reserved the reserved
* @return the boolean
*/ */
default boolean transferLeash(BlockPos fromKnotBlockPos, Entity toEntity, String reserved) { default boolean transferLeash(BlockPos fromKnotBlockPos, Entity toEntity, String reserved) {
return getLeashData().transferLeash(fromKnotBlockPos, toEntity, reserved); return getLeashData().transferLeash(fromKnotBlockPos, toEntity, reserved);
} }
/**
* Is in delayed leash boolean.
*
* @param holderUUID the holder uuid
* @return the boolean
*/
default boolean isInDelayedLeash(UUID holderUUID) { default boolean isInDelayedLeash(UUID holderUUID) {
return getLeashData().isInDelayedLeash(holderUUID); return getLeashData().isInDelayedLeash(holderUUID);
} }
@ -291,6 +582,8 @@ public interface ILeashHelper {
/** /**
* 检查是否可以被拴绳 * 检查是否可以被拴绳
*
* @return the boolean
*/ */
default boolean canBeLeashed() { default boolean canBeLeashed() {
return getLeashData().canBeLeashed(); return getLeashData().canBeLeashed();
@ -298,17 +591,37 @@ public interface ILeashHelper {
/** /**
* 检查是否可以拴到特定目标 * 检查是否可以拴到特定目标
*
* @param holder the holder
* @return the boolean
*/ */
default boolean canBeAttachedTo(Entity holder) { default boolean canBeAttachedTo(Entity holder) {
return getLeashData().canBeAttachedTo(holder); return getLeashData().canBeAttachedTo(holder);
} }
} }
/**
* Choose method with boolean ret boolean.
*
* @param cond the cond
* @param trueSupplier the true supplier
* @param falseSupplier the false supplier
* @return the boolean
*/
static boolean chooseMethodWithBooleanRet(@NotNull Supplier<Boolean> cond, Supplier<Boolean> trueSupplier, Supplier<Boolean> falseSupplier) { static boolean chooseMethodWithBooleanRet(@NotNull Supplier<Boolean> cond, Supplier<Boolean> trueSupplier, Supplier<Boolean> falseSupplier) {
if (cond.get()) { if (cond.get()) {
return trueSupplier.get(); return trueSupplier.get();
} }
return falseSupplier.get(); return falseSupplier.get();
} }
/**
* Choose method with void ret.
*
* @param cond the cond
* @param trueSupplier the true supplier
* @param falseSupplier the false supplier
*/
static void chooseMethodWithVoidRet(@NotNull Supplier<Boolean> cond, Supplier<Void> trueSupplier, Supplier<Void> falseSupplier) { static void chooseMethodWithVoidRet(@NotNull Supplier<Boolean> cond, Supplier<Void> trueSupplier, Supplier<Void> falseSupplier) {
if (cond.get()) { if (cond.get()) {
trueSupplier.get(); trueSupplier.get();

View File

@ -18,6 +18,7 @@ package top.r3944realms.superleadrope.api.workspace;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import top.r3944realms.superleadrope.api.type.capabilty.ILeashData; import top.r3944realms.superleadrope.api.type.capabilty.ILeashData;
@ -28,12 +29,78 @@ import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.function.Predicate; import java.util.function.Predicate;
/**
* The interface Work space helper.
*/
public interface IWorkSpaceHelper { public interface IWorkSpaceHelper {
/**
* Leashable in area list.
*
* @param pLevel the p level
* @param pPos the p pos
* @param filter the filter
* @param fetchDistance the fetch distance
* @return the list
*/
@NotNull List<Entity> leashableInArea(@NotNull Level pLevel, Vec3 pPos, Predicate<Entity> filter, double fetchDistance); @NotNull List<Entity> leashableInArea(@NotNull Level pLevel, Vec3 pPos, Predicate<Entity> filter, double fetchDistance);
/**
* Leashable in area list.
*
* @param pLevel the p level
* @param clazz the clazz
* @param filter the filter
* @param box the box
* @return the list
*/
@NotNull List<Entity> leashableInArea(@NotNull Level pLevel, Class<Entity> clazz,Predicate<Entity> filter, AABB box);
/**
* Gets leash helper.
*
* @return the leash helper
*/
ILeashHelper getLeashHelper(); ILeashHelper getLeashHelper();
/**
* Is super lead knot boolean.
*
* @param pEntity the p entity
* @return the boolean
*/
boolean isSuperLeadKnot(Entity pEntity); boolean isSuperLeadKnot(Entity pEntity);
/**
* Gets super lead pos.
*
* @param pEntity the p entity
* @return the super lead pos
* @throws IllegalArgumentException the illegal argument exception
*/
BlockPos getSuperLeadPos(Entity pEntity) throws IllegalArgumentException; BlockPos getSuperLeadPos(Entity pEntity) throws IllegalArgumentException;
/**
* Is leashable boolean.
*
* @param pEntity the p entity
* @return the boolean
*/
boolean isLeashable(@NotNull Entity pEntity); boolean isLeashable(@NotNull Entity pEntity);
/**
* Gets leash data.
*
* @param pEntity the p entity
* @return the leash data
*/
Optional<ILeashData> getLeashData(@NotNull Entity pEntity); Optional<ILeashData> getLeashData(@NotNull Entity pEntity);
/**
* Gets leash state.
*
* @param pEntity the p entity
* @return the leash state
*/
Optional<ILeashState> getLeashState(@NotNull Entity pEntity); Optional<ILeashState> getLeashState(@NotNull Entity pEntity);
} }

View File

@ -19,8 +19,22 @@ import top.r3944realms.superleadrope.api.SuperLeadRopeApi;
import java.util.ServiceLoader; import java.util.ServiceLoader;
/**
* The type Services.
*/
public class Services { public class Services {
/**
* The constant WORK_SPACE.
*/
public static final IWorkSpaceHelper WORK_SPACE = load(IWorkSpaceHelper.class); public static final IWorkSpaceHelper WORK_SPACE = load(IWorkSpaceHelper.class);
/**
* Load t.
*
* @param <T> the type parameter
* @param clazz the clazz
* @return the t
*/
public static <T> T load(Class<T> clazz) { public static <T> T load(Class<T> clazz) {
final T loadedService = ServiceLoader.load(clazz) final T loadedService = ServiceLoader.load(clazz)
.findFirst() .findFirst()

View File

@ -41,10 +41,21 @@ import java.io.IOException;
import static top.r3944realms.superleadrope.core.util.PotatoModeHelper.getCurrentMode; import static top.r3944realms.superleadrope.core.util.PotatoModeHelper.getCurrentMode;
/**
* The type Client event handler.
*/
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public class ClientEventHandler { public class ClientEventHandler {
/**
* The type Game.
*/
@net.minecraftforge.fml.common.Mod.EventBusSubscriber(modid = SuperLeadRope.MOD_ID, value = Dist.CLIENT, bus = net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus.FORGE) @net.minecraftforge.fml.common.Mod.EventBusSubscriber(modid = SuperLeadRope.MOD_ID, value = Dist.CLIENT, bus = net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus.FORGE)
public static class Game { public static class Game {
/**
* On level renderer.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public static void onLevelRenderer (RenderLevelStageEvent event) { public static void onLevelRenderer (RenderLevelStageEvent event) {
if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_ENTITIES) { if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_ENTITIES) {
@ -52,15 +63,30 @@ public class ClientEventHandler {
} }
LeashRenderHandler.onRenderLevelStage(event.getPoseStack(), event.getPartialTick()); LeashRenderHandler.onRenderLevelStage(event.getPoseStack(), event.getPartialTick());
} }
// 未使用-注释
/**
* On player logged out.
*
* @param event the event
*/
// 未使用-注释
@SubscribeEvent @SubscribeEvent
public static void onPlayerLoggedOut(ClientPlayerNetworkEvent.LoggingOut event) { public static void onPlayerLoggedOut(ClientPlayerNetworkEvent.LoggingOut event) {
// 清理客户端缓存数据 // 清理客户端缓存数据
EternalPotatoFacade.clear(); EternalPotatoFacade.clear();
} }
} }
/**
* The type Mod.
*/
@net.minecraftforge.fml.common.Mod.EventBusSubscriber(modid = SuperLeadRope.MOD_ID, value = Dist.CLIENT, bus = net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus.MOD) @net.minecraftforge.fml.common.Mod.EventBusSubscriber(modid = SuperLeadRope.MOD_ID, value = Dist.CLIENT, bus = net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus.MOD)
public static class Mod { public static class Mod {
/**
* On client initializer.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public static void onClientInitializer (FMLClientSetupEvent event) { public static void onClientInitializer (FMLClientSetupEvent event) {
event.enqueueWork(() -> { event.enqueueWork(() -> {
@ -76,14 +102,33 @@ public class ClientEventHandler {
EternalPotatoFacade.init(mode, false); // 客户端 EternalPotatoFacade.init(mode, false); // 客户端
}); });
} }
/**
* On register model layer.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public static void onRegisterModelLayer (EntityRenderersEvent.RegisterLayerDefinitions event) { public static void onRegisterModelLayer (EntityRenderersEvent.RegisterLayerDefinitions event) {
event.registerLayerDefinition(SLPModelLayers.SUPER_LEASH_KNOT, SuperLeashKnotModel::createBodyLayer); event.registerLayerDefinition(SLPModelLayers.SUPER_LEASH_KNOT, SuperLeashKnotModel::createBodyLayer);
} }
/**
* On register renderer.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public static void onRegisterRenderer (EntityRenderersEvent.RegisterRenderers event) { public static void onRegisterRenderer (EntityRenderersEvent.RegisterRenderers event) {
event.registerEntityRenderer(SLPEntityTypes.SUPER_LEAD_KNOT.get(), SuperLeashKnotRenderer::new); event.registerEntityRenderer(SLPEntityTypes.SUPER_LEAD_KNOT.get(), SuperLeashKnotRenderer::new);
} }
/**
* On register shaders.
*
* @param event the event
* @throws IOException the io exception
*/
@SubscribeEvent @SubscribeEvent
public static void onRegisterShaders(RegisterShadersEvent event) throws IOException { public static void onRegisterShaders(RegisterShadersEvent event) throws IOException {
SLPShaderRegistry.registerShaders(event); SLPShaderRegistry.registerShaders(event);

View File

@ -28,18 +28,33 @@ import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/**
* The type Super leash knot model.
*
* @param <T> the type parameter
*/
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public class SuperLeashKnotModel<T extends Entity> extends HierarchicalModel<T> { public class SuperLeashKnotModel<T extends Entity> extends HierarchicalModel<T> {
private static final String KNOT = "knot"; private static final String KNOT = "knot";
private final ModelPart root; private final ModelPart root;
private final ModelPart knot; private final ModelPart knot;
public SuperLeashKnotModel(ModelPart root) { /**
* Instantiates a new Super leash knot model.
*
* @param root the root
*/
public SuperLeashKnotModel(ModelPart root) {
this.root = root; this.root = root;
this.knot = root.getChild(KNOT); this.knot = root.getChild(KNOT);
} }
public static LayerDefinition createBodyLayer() { /**
* Create body layer layer definition.
*
* @return the layer definition
*/
public static LayerDefinition createBodyLayer() {
MeshDefinition meshdefinition = new MeshDefinition(); MeshDefinition meshdefinition = new MeshDefinition();
PartDefinition partdefinition = meshdefinition.getRoot(); PartDefinition partdefinition = meshdefinition.getRoot();
partdefinition.addOrReplaceChild(KNOT, partdefinition.addOrReplaceChild(KNOT,

View File

@ -21,8 +21,14 @@ import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import top.r3944realms.superleadrope.SuperLeadRope; import top.r3944realms.superleadrope.SuperLeadRope;
/**
* The type Slp model layers.
*/
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public class SLPModelLayers { public class SLPModelLayers {
/**
* The constant SUPER_LEASH_KNOT.
*/
public static final ModelLayerLocation SUPER_LEASH_KNOT = public static final ModelLayerLocation SUPER_LEASH_KNOT =
new ModelLayerLocation( new ModelLayerLocation(
new ResourceLocation(SuperLeadRope.MOD_ID, "super_leash_knot"), new ResourceLocation(SuperLeadRope.MOD_ID, "super_leash_knot"),

View File

@ -31,7 +31,16 @@ import top.r3944realms.superleadrope.util.capability.LeashDataInnerAPI;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
/**
* The type Leash render handler.
*/
public class LeashRenderHandler { public class LeashRenderHandler {
/**
* On render level stage.
*
* @param poseStack the pose stack
* @param partialTick the partial tick
*/
public static void onRenderLevelStage(PoseStack poseStack, float partialTick) { public static void onRenderLevelStage(PoseStack poseStack, float partialTick) {
renderAllCustomLeashes(poseStack, partialTick); renderAllCustomLeashes(poseStack, partialTick);
} }

View File

@ -23,12 +23,40 @@ import net.minecraft.client.renderer.RenderType;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import top.r3944realms.superleadrope.SuperLeadRope; import top.r3944realms.superleadrope.SuperLeadRope;
/**
* The type Slp render type.
*/
public class SLPRenderType extends RenderType { public class SLPRenderType extends RenderType {
/**
* Instantiates a new Slp render type.
*
* @param name the name
* @param format the format
* @param mode the mode
* @param bufferSize the buffer size
* @param affectsCrumbling the affects crumbling
* @param sortOnUpload the sort on upload
* @param setupState the setup state
* @param clearState the clear state
*/
public SLPRenderType(String name, VertexFormat format, VertexFormat.Mode mode, int bufferSize, boolean affectsCrumbling, boolean sortOnUpload, Runnable setupState, Runnable clearState) { public SLPRenderType(String name, VertexFormat format, VertexFormat.Mode mode, int bufferSize, boolean affectsCrumbling, boolean sortOnUpload, Runnable setupState, Runnable clearState) {
super(name, format, mode, bufferSize, affectsCrumbling, sortOnUpload, setupState, clearState); super(name, format, mode, bufferSize, affectsCrumbling, sortOnUpload, setupState, clearState);
} }
/**
* The Super leash.
*/
static RenderType SUPER_LEASH; static RenderType SUPER_LEASH;
/**
* The constant POSITION_COLOR_LIGHTMAP_NORMAL.
*/
public static final VertexFormat POSITION_COLOR_LIGHTMAP_NORMAL; public static final VertexFormat POSITION_COLOR_LIGHTMAP_NORMAL;
/**
* Leash type render type.
*
* @return the render type
*/
public static RenderType leashType() { public static RenderType leashType() {
return SUPER_LEASH; return SUPER_LEASH;
} }

View File

@ -23,9 +23,22 @@ import top.r3944realms.superleadrope.SuperLeadRope;
import java.io.IOException; import java.io.IOException;
/**
* The type Slp shader registry.
*/
public class SLPShaderRegistry { public class SLPShaderRegistry {
private static final ResourceLocation RL_SUPER_ROPE = new ResourceLocation(SuperLeadRope.MOD_ID, "super_leash"); private static final ResourceLocation RL_SUPER_ROPE = new ResourceLocation(SuperLeadRope.MOD_ID, "super_leash");
/**
* The constant ROPE_SHADER.
*/
public static ShaderInstance ROPE_SHADER; public static ShaderInstance ROPE_SHADER;
/**
* Register shaders.
*
* @param event the event
* @throws IOException the io exception
*/
public static void registerShaders(RegisterShadersEvent event) throws IOException { public static void registerShaders(RegisterShadersEvent event) throws IOException {
event.registerShader( event.registerShader(
new ShaderInstance( new ShaderInstance(

View File

@ -28,11 +28,21 @@ import net.minecraft.world.phys.Vec3;
import org.joml.Matrix4f; import org.joml.Matrix4f;
import top.r3944realms.superleadrope.client.renderer.state.SuperLeashRenderState; import top.r3944realms.superleadrope.client.renderer.state.SuperLeashRenderState;
/**
* The type Super leash renderer.
*/
@SuppressWarnings("UnnecessaryLocalVariable") @SuppressWarnings("UnnecessaryLocalVariable")
public class SuperLeashRenderer { public class SuperLeashRenderer {
private static final int LEASH_STEPS = 24; private static final int LEASH_STEPS = 24;
/**
* Render leash.
*
* @param state the state
* @param poseStack the pose stack
* @param buffer the buffer
*/
public static void renderLeash(SuperLeashRenderState state, PoseStack poseStack, MultiBufferSource buffer) { public static void renderLeash(SuperLeashRenderState state, PoseStack poseStack, MultiBufferSource buffer) {
poseStack.pushPose(); poseStack.pushPose();
@ -162,11 +172,51 @@ public class SuperLeashRenderer {
/** 横纵偏移数据 */ /** 横纵偏移数据 */
private static class Offsets { private static class Offsets {
public final float dx, dy, dz; // 绳子差向量 /**
public final float xOffset, zOffset; // 横向偏移 * The Dx.
public final float yOffsetPass1, dyOffsetPass1; // pass1 纵向偏移 */
public final float yOffsetPass2, dyOffsetPass2; // pass2 纵向偏移 public final float dx, /**
* The Dy.
*/
dy, /**
* The Dz.
*/
dz; // 绳子差向量
/**
* The X offset.
*/
public final float xOffset, /**
* The Z offset.
*/
zOffset; // 横向偏移
/**
* The Y offset pass 1.
*/
public final float yOffsetPass1, /**
* The Dy offset pass 1.
*/
dyOffsetPass1; // pass1 纵向偏移
/**
* The Y offset pass 2.
*/
public final float yOffsetPass2, /**
* The Dy offset pass 2.
*/
dyOffsetPass2; // pass2 纵向偏移
/**
* Instantiates a new Offsets.
*
* @param dx the dx
* @param dy the dy
* @param dz the dz
* @param xOffset the x offset
* @param zOffset the z offset
* @param yOffsetPass1 the y offset pass 1
* @param dyOffsetPass1 the dy offset pass 1
* @param yOffsetPass2 the y offset pass 2
* @param dyOffsetPass2 the dy offset pass 2
*/
public Offsets(float dx, float dy, float dz, public Offsets(float dx, float dy, float dz,
float xOffset, float zOffset, float xOffset, float zOffset,
float yOffsetPass1, float dyOffsetPass1, float yOffsetPass1, float dyOffsetPass1,

View File

@ -31,10 +31,19 @@ import top.r3944realms.superleadrope.client.model.SuperLeashKnotModel;
import top.r3944realms.superleadrope.client.model.geom.SLPModelLayers; import top.r3944realms.superleadrope.client.model.geom.SLPModelLayers;
import top.r3944realms.superleadrope.content.entity.SuperLeashKnotEntity; import top.r3944realms.superleadrope.content.entity.SuperLeashKnotEntity;
/**
* The type Super leash knot renderer.
*/
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public class SuperLeashKnotRenderer extends EntityRenderer<SuperLeashKnotEntity> { public class SuperLeashKnotRenderer extends EntityRenderer<SuperLeashKnotEntity> {
private static final ResourceLocation KNOT_LOCATION = new ResourceLocation(SuperLeadRope.MOD_ID, "textures/entity/super_lead_knot.png"); private static final ResourceLocation KNOT_LOCATION = new ResourceLocation(SuperLeadRope.MOD_ID, "textures/entity/super_lead_knot.png");
private final SuperLeashKnotModel<SuperLeashKnotEntity> model; private final SuperLeashKnotModel<SuperLeashKnotEntity> model;
/**
* Instantiates a new Super leash knot renderer.
*
* @param context the context
*/
public SuperLeashKnotRenderer(EntityRendererProvider.Context context) { public SuperLeashKnotRenderer(EntityRendererProvider.Context context) {
super(context); super(context);
this.model = new SuperLeashKnotModel<>(context.bakeLayer(SLPModelLayers.SUPER_LEASH_KNOT)); this.model = new SuperLeashKnotModel<>(context.bakeLayer(SLPModelLayers.SUPER_LEASH_KNOT));

View File

@ -36,6 +36,9 @@ import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
/**
* The type Super leash state resolver.
*/
//TODO: 未来实现更高级的渲染 //TODO: 未来实现更高级的渲染
public class SuperLeashStateResolver { public class SuperLeashStateResolver {
@ -52,6 +55,15 @@ public class SuperLeashStateResolver {
/* ------------------------ 主解析方法 ------------------------ */ /* ------------------------ 主解析方法 ------------------------ */
/**
* Resolve optional.
*
* @param holder the holder
* @param leashedEntity the leashed entity
* @param leashInfo the leash info
* @param partialTicks the partial ticks
* @return the optional
*/
public static Optional<SuperLeashRenderState> resolve(Entity holder, Entity leashedEntity, public static Optional<SuperLeashRenderState> resolve(Entity holder, Entity leashedEntity,
LeashInfo leashInfo, float partialTicks) { LeashInfo leashInfo, float partialTicks) {
@ -156,12 +168,14 @@ public class SuperLeashStateResolver {
return Optional.ofNullable(leashState.holderLocationOffset()) return Optional.ofNullable(leashState.holderLocationOffset())
.orElse(leashState.defaultHolderLocationOffset()); .orElse(leashState.defaultHolderLocationOffset());
} }
/** /**
* 将局部偏移向量应用到实体旋转返回世界坐标位置 * 将局部偏移向量应用到实体旋转返回世界坐标位置
* @param entity 实体 *
* @param localOffset 局部偏移相对于实体局部坐标系 * @param entity 实体
* @param localOffset 局部偏移相对于实体局部坐标系
* @param partialTicks 插值参数 * @param partialTicks 插值参数
* @return 偏移旋转后的世界坐标位置 * @return 偏移旋转后的世界坐标位置 vec 3
*/ */
public static @NotNull Vec3 applyOffsetWithRotation(Entity entity, Vec3 localOffset, float partialTicks) { public static @NotNull Vec3 applyOffsetWithRotation(Entity entity, Vec3 localOffset, float partialTicks) {
// 实体中心位置 // 实体中心位置
@ -226,6 +240,11 @@ public class SuperLeashStateResolver {
/** /**
* 获取实体挂点位置支持旋转偏移 * 获取实体挂点位置支持旋转偏移
*
* @param entity the entity
* @param baseOffset the base offset
* @param partialTicks the partial ticks
* @return the entity leash holder pos
*/ */
public static Vec3 getEntityLeashHolderPos(Entity entity, Vec3 baseOffset, float partialTicks) { public static Vec3 getEntityLeashHolderPos(Entity entity, Vec3 baseOffset, float partialTicks) {
// 从眼睛位置头部开始 // 从眼睛位置头部开始

View File

@ -18,6 +18,9 @@ package top.r3944realms.superleadrope.client.renderer.state;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
/**
* The type Super leash render state.
*/
public record SuperLeashRenderState( public record SuperLeashRenderState(
Vec3 startPos, // 当前帧起点位置 Vec3 startPos, // 当前帧起点位置
Vec3 endPos, // 当前帧终点位置 Vec3 endPos, // 当前帧终点位置
@ -35,16 +38,26 @@ public record SuperLeashRenderState(
boolean isFirstPerson, // 是否是第一人称 boolean isFirstPerson, // 是否是第一人称
BlockPos belowBlockPos // 持有者位置 BlockPos belowBlockPos // 持有者位置
) { ) {
// 预定义颜色常量 /**
* The constant COLOR_NORMAL.
*/
// 预定义颜色常量
public static final int COLOR_NORMAL = 0xFF6B4E2E; // 深棕色木绳色温暖自然 public static final int COLOR_NORMAL = 0xFF6B4E2E; // 深棕色木绳色温暖自然
/**
* The constant COLOR_TENSION.
*/
public static final int COLOR_TENSION = 0xFFD9A066; // 黄色偏橙张力稍高时微亮 public static final int COLOR_TENSION = 0xFFD9A066; // 黄色偏橙张力稍高时微亮
/**
* The constant COLOR_CRITICAL.
*/
public static final int COLOR_CRITICAL = 0xFFB03A2E; // 暗红色即将断裂警告色 public static final int COLOR_CRITICAL = 0xFFB03A2E; // 暗红色即将断裂警告色
/** /**
* 计算当前帧的摆动偏移量(用于波浪效果) * 计算当前帧的摆动偏移量(用于波浪效果)
* @param progress 沿绳子的进度(0.0-1.0) *
* @param progress 沿绳子的进度(0.0-1.0)
* @param partialTicks 部分tick时间 * @param partialTicks 部分tick时间
* @return 垂直于绳子方向的偏移向量 * @return 垂直于绳子方向的偏移向量 swing offset
*/ */
public Vec3 getSwingOffset(float progress, float partialTicks) { public Vec3 getSwingOffset(float progress, float partialTicks) {
// 基于正弦波的摆动效果 // 基于正弦波的摆动效果

View File

@ -19,8 +19,21 @@ import dev.dubhe.curtain.features.player.patches.EntityPlayerMPFake;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.ModList;
/**
* The type Curtain compat.
*/
public class CurtainCompat { public class CurtainCompat {
/**
* The constant isModLoaded.
*/
public final static boolean isModLoaded = ModList.get().isLoaded("curtain"); public final static boolean isModLoaded = ModList.get().isLoaded("curtain");
/**
* Is not fake player boolean.
*
* @param player the player
* @return the boolean
*/
public static boolean isNotFakePlayer(Player player) { public static boolean isNotFakePlayer(Player player) {
if (isModLoaded) { if (isModLoaded) {
return !(player instanceof EntityPlayerMPFake); return !(player instanceof EntityPlayerMPFake);

View File

@ -21,6 +21,9 @@ import net.minecraft.resources.ResourceLocation;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import top.r3944realms.superleadrope.SuperLeadRope; import top.r3944realms.superleadrope.SuperLeadRope;
/**
* The type Jei plugin.
*/
@JeiPlugin @JeiPlugin
public class JEIPlugin implements IModPlugin { public class JEIPlugin implements IModPlugin {
private static final ResourceLocation UID = new ResourceLocation(SuperLeadRope.MOD_ID, "jei_plugin"); private static final ResourceLocation UID = new ResourceLocation(SuperLeadRope.MOD_ID, "jei_plugin");

View File

@ -6,9 +6,21 @@ import java.util.List;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
/**
* The type Leash common config.
*/
public class LeashCommonConfig { public class LeashCommonConfig {
/**
* The constant BUILDER.
*/
public static final ForgeConfigSpec.Builder BUILDER = new ForgeConfigSpec.Builder(); public static final ForgeConfigSpec.Builder BUILDER = new ForgeConfigSpec.Builder();
/**
* The constant SPEC.
*/
public static final ForgeConfigSpec SPEC; public static final ForgeConfigSpec SPEC;
/**
* The constant COMMON.
*/
public static final Common COMMON; public static final Common COMMON;
static { static {
@ -17,38 +29,97 @@ public class LeashCommonConfig {
SPEC = BUILDER.build(); SPEC = BUILDER.build();
} }
/**
* The type Common.
*/
public static class Common { public static class Common {
// Command /**
* The Enable slp mod command prefix.
*/
// Command
public final ForgeConfigSpec.BooleanValue enableSLPModCommandPrefix; public final ForgeConfigSpec.BooleanValue enableSLPModCommandPrefix;
/**
* The Slp mod command prefix.
*/
public final ForgeConfigSpec.ConfigValue<String> SLPModCommandPrefix; public final ForgeConfigSpec.ConfigValue<String> SLPModCommandPrefix;
// Entity /**
* The Teleport whitelist.
*/
// Entity
public final ForgeConfigSpec.ConfigValue<List<? extends String>> teleportWhitelist; public final ForgeConfigSpec.ConfigValue<List<? extends String>> teleportWhitelist;
// Leash settings /**
* The Max leash length.
*/
// Leash settings
public final ForgeConfigSpec.DoubleValue maxLeashLength; public final ForgeConfigSpec.DoubleValue maxLeashLength;
/**
* The Elastic distance scale.
*/
public final ForgeConfigSpec.DoubleValue elasticDistanceScale; public final ForgeConfigSpec.DoubleValue elasticDistanceScale;
/**
* The Extreme snap factor.
*/
public final ForgeConfigSpec.DoubleValue extremeSnapFactor; public final ForgeConfigSpec.DoubleValue extremeSnapFactor;
/**
* The Spring dampening.
*/
public final ForgeConfigSpec.DoubleValue springDampening; public final ForgeConfigSpec.DoubleValue springDampening;
/**
* The Axis specific elasticity.
*/
public final ForgeConfigSpec.ConfigValue<List<? extends Double>> axisSpecificElasticity; public final ForgeConfigSpec.ConfigValue<List<? extends Double>> axisSpecificElasticity;
/**
* The Max leashes per entity.
*/
public final ForgeConfigSpec.IntValue maxLeashesPerEntity; public final ForgeConfigSpec.IntValue maxLeashesPerEntity;
// True damping /**
* The Enable true damping.
*/
// True damping
public final ForgeConfigSpec.BooleanValue enableTrueDamping; public final ForgeConfigSpec.BooleanValue enableTrueDamping;
/**
* The Damping factor.
*/
public final ForgeConfigSpec.DoubleValue dampingFactor; public final ForgeConfigSpec.DoubleValue dampingFactor;
/**
* The Max force.
*/
public final ForgeConfigSpec.DoubleValue maxForce; public final ForgeConfigSpec.DoubleValue maxForce;
/**
* The Player spring factor.
*/
public final ForgeConfigSpec.DoubleValue playerSpringFactor; public final ForgeConfigSpec.DoubleValue playerSpringFactor;
/**
* The Mob spring factor.
*/
public final ForgeConfigSpec.DoubleValue mobSpringFactor; public final ForgeConfigSpec.DoubleValue mobSpringFactor;
// Leash state offsets /**
* The Default apply entity location offset.
*/
// Leash state offsets
public final ForgeConfigSpec.ConfigValue<List<? extends String>> defaultApplyEntityLocationOffset; public final ForgeConfigSpec.ConfigValue<List<? extends String>> defaultApplyEntityLocationOffset;
/**
* The Default holder location offset.
*/
public final ForgeConfigSpec.ConfigValue<List<? extends String>> defaultHolderLocationOffset; public final ForgeConfigSpec.ConfigValue<List<? extends String>> defaultHolderLocationOffset;
// 正则表达式模式 /**
* The constant OFFSET_PATTERN.
*/
// 正则表达式模式
static final Pattern OFFSET_PATTERN = Pattern.compile( static final Pattern OFFSET_PATTERN = Pattern.compile(
"(?i)(?:vec3|vec3d|vector3|offset)\\s*\\(\\s*([-+]?[0-9]*\\.?[0-9]+)\\s*,\\s*([-+]?[0-9]*\\.?[0-9]+)\\s*,\\s*([-+]?[0-9]*\\.?[0-9]+)\\s*\\)\\s*:\\s*\\[\\s*([^]]+?)\\s*]\\s*" "(?i)(?:vec3|vec3d|vector3|offset)\\s*\\(\\s*([-+]?[0-9]*\\.?[0-9]+)\\s*,\\s*([-+]?[0-9]*\\.?[0-9]+)\\s*,\\s*([-+]?[0-9]*\\.?[0-9]+)\\s*\\)\\s*:\\s*\\[\\s*([^]]+?)\\s*]\\s*"
); );
/**
* Instantiates a new Common.
*
* @param builder the builder
*/
public Common(ForgeConfigSpec.Builder builder) { public Common(ForgeConfigSpec.Builder builder) {
// ===== Command ===== // ===== Command =====
builder.push("Command"); builder.push("Command");

View File

@ -30,9 +30,18 @@ import java.util.regex.Matcher;
import static top.r3944realms.superleadrope.config.LeashCommonConfig.Common.OFFSET_PATTERN; import static top.r3944realms.superleadrope.config.LeashCommonConfig.Common.OFFSET_PATTERN;
/**
* The type Leash config manager.
*/
public class LeashConfigManager { public class LeashConfigManager {
// ========== 最值检测 ========== /**
* The constant MAX_DISTANCE_CHECK.
*/
// ========== 最值检测 ==========
public static final Predicate<Double> MAX_DISTANCE_CHECK = distance -> distance == null || (distance >= 6.0 && distance <= 256.0); public static final Predicate<Double> MAX_DISTANCE_CHECK = distance -> distance == null || (distance >= 6.0 && distance <= 256.0);
/**
* The constant ELASTIC_DISTANCE_CHECK.
*/
public static final Predicate<Double> ELASTIC_DISTANCE_CHECK = distance -> distance == null || (distance >= 0.2 && distance <= 4.0); public static final Predicate<Double> ELASTIC_DISTANCE_CHECK = distance -> distance == null || (distance >= 0.2 && distance <= 4.0);
// ========== 偏移映射 ========== // ========== 偏移映射 ==========
private final Map<String, double[]> entityHolderMap = new ConcurrentHashMap<>(); private final Map<String, double[]> entityHolderMap = new ConcurrentHashMap<>();
@ -60,6 +69,9 @@ public class LeashConfigManager {
private volatile List<Double> axisElasticity = List.of(0.8, 0.2, 0.8); private volatile List<Double> axisElasticity = List.of(0.8, 0.2, 0.8);
private volatile int maxLeashesPerEntity = 6; private volatile int maxLeashesPerEntity = 6;
/**
* Instantiates a new Leash config manager.
*/
public LeashConfigManager() { public LeashConfigManager() {
reloadAll(); reloadAll();
} }
@ -102,6 +114,9 @@ public class LeashConfigManager {
); );
} }
/**
* Parse offset config.
*/
public void parseOffsetConfig() { public void parseOffsetConfig() {
Map<String, Map<String, double[]>> holder = parseOffsetList(LeashCommonConfig.COMMON.defaultHolderLocationOffset.get()); Map<String, Map<String, double[]>> holder = parseOffsetList(LeashCommonConfig.COMMON.defaultHolderLocationOffset.get());
entityHolderMap.clear(); entityHolderMap.putAll(holder.get("entity")); entityHolderMap.clear(); entityHolderMap.putAll(holder.get("entity"));
@ -126,6 +141,12 @@ public class LeashConfigManager {
return modMap.getOrDefault("*", null); return modMap.getOrDefault("*", null);
} }
/**
* Gets default entity offset.
*
* @param type the type
* @return the default entity offset
*/
@SuppressWarnings({"DuplicatedCode", "deprecation"}) @SuppressWarnings({"DuplicatedCode", "deprecation"})
public Vec3 getDefaultEntityOffset(EntityType<?> type) { public Vec3 getDefaultEntityOffset(EntityType<?> type) {
String entityId = type.builtInRegistryHolder().key().location().toString(); String entityId = type.builtInRegistryHolder().key().location().toString();
@ -137,6 +158,12 @@ public class LeashConfigManager {
return offset != null ? new Vec3(offset[0], offset[1], offset[2]) : Vec3.ZERO; return offset != null ? new Vec3(offset[0], offset[1], offset[2]) : Vec3.ZERO;
} }
/**
* Gets default holder offset.
*
* @param type the type
* @return the default holder offset
*/
@SuppressWarnings({"DuplicatedCode", "deprecation"}) @SuppressWarnings({"DuplicatedCode", "deprecation"})
public Vec3 getDefaultHolderOffset(EntityType<?> type) { public Vec3 getDefaultHolderOffset(EntityType<?> type) {
String entityId = type.builtInRegistryHolder().key().location().toString(); String entityId = type.builtInRegistryHolder().key().location().toString();
@ -148,11 +175,36 @@ public class LeashConfigManager {
return offset != null ? new Vec3(offset[0], offset[1], offset[2]) : Vec3.ZERO; return offset != null ? new Vec3(offset[0], offset[1], offset[2]) : Vec3.ZERO;
} }
/**
* Gets default entity offset.
*
* @param entity the entity
* @return the default entity offset
*/
public Vec3 getDefaultEntityOffset(Entity entity) { return getDefaultEntityOffset(entity.getType()); } public Vec3 getDefaultEntityOffset(Entity entity) { return getDefaultEntityOffset(entity.getType()); }
/**
* Gets default holder offset.
*
* @param entity the entity
* @return the default holder offset
*/
public Vec3 getDefaultHolderOffset(Entity entity) { return getDefaultHolderOffset(entity.getType()); } public Vec3 getDefaultHolderOffset(Entity entity) { return getDefaultHolderOffset(entity.getType()); }
// ================== 白名单 ================== /**
* Gets teleport whitelist.
*
* @return the teleport whitelist
*/
// ================== 白名单 ==================
public List<String> getTeleportWhitelist() { return Collections.unmodifiableList(teleportWhitelistCache); } public List<String> getTeleportWhitelist() { return Collections.unmodifiableList(teleportWhitelistCache); }
/**
* Is entity teleport allowed boolean.
*
* @param type the type
* @return the boolean
*/
@SuppressWarnings({"DuplicatedCode", "deprecation"}) @SuppressWarnings({"DuplicatedCode", "deprecation"})
public boolean isEntityTeleportAllowed(EntityType<?> type) { public boolean isEntityTeleportAllowed(EntityType<?> type) {
String entityId = type.builtInRegistryHolder().key().location().toString(); String entityId = type.builtInRegistryHolder().key().location().toString();
@ -173,36 +225,146 @@ public class LeashConfigManager {
return false; return false;
} }
/**
* Is entity teleport allowed boolean.
*
* @param entity the entity
* @return the boolean
*/
public boolean isEntityTeleportAllowed(Entity entity) { return isEntityTeleportAllowed(entity.getType()); } public boolean isEntityTeleportAllowed(Entity entity) { return isEntityTeleportAllowed(entity.getType()); }
// ================== 命令 ================== /**
* Gets command prefix.
*
* @return the command prefix
*/
// ================== 命令 ==================
public String getCommandPrefix() { return commandPrefixCache; } public String getCommandPrefix() { return commandPrefixCache; }
/**
* Is command prefix enabled boolean.
*
* @return the boolean
*/
public boolean isCommandPrefixEnabled() { return commandPrefixEnabledCache; } public boolean isCommandPrefixEnabled() { return commandPrefixEnabledCache; }
/**
* Gets full command.
*
* @param subCommand the sub command
* @return the full command
*/
public String getFullCommand(String subCommand) { public String getFullCommand(String subCommand) {
return isCommandPrefixEnabled() ? getCommandPrefix() + " " + subCommand : subCommand; return isCommandPrefixEnabled() ? getCommandPrefix() + " " + subCommand : subCommand;
} }
// ================== 拴绳物理参数 ================== /**
* Is enable true damping boolean.
*
* @return the boolean
*/
// ================== 拴绳物理参数 ==================
public boolean isEnableTrueDamping() { return enableTrueDamping; } public boolean isEnableTrueDamping() { return enableTrueDamping; }
/**
* Gets max force.
*
* @return the max force
*/
public double getMaxForce() { return maxForce; } public double getMaxForce() { return maxForce; }
/**
* Gets player spring factor.
*
* @return the player spring factor
*/
public double getPlayerSpringFactor() { return playerSpringFactor; } public double getPlayerSpringFactor() { return playerSpringFactor; }
/**
* Gets mob spring factor.
*
* @return the mob spring factor
*/
public double getMobSpringFactor() { return mobSpringFactor; } public double getMobSpringFactor() { return mobSpringFactor; }
/**
* Gets max leash length.
*
* @return the max leash length
*/
public double getMaxLeashLength() { return maxLeashLength; } public double getMaxLeashLength() { return maxLeashLength; }
/**
* Gets elastic distance scale.
*
* @return the elastic distance scale
*/
public double getElasticDistanceScale() { return elasticDistanceScale; } public double getElasticDistanceScale() { return elasticDistanceScale; }
/**
* Gets extreme snap factor.
*
* @return the extreme snap factor
*/
public double getExtremeSnapFactor() { return extremeSnapFactor; } public double getExtremeSnapFactor() { return extremeSnapFactor; }
/**
* Gets spring dampening.
*
* @return the spring dampening
*/
public double getSpringDampening() { return springDampening; } public double getSpringDampening() { return springDampening; }
/**
* Gets axis elasticity.
*
* @return the axis elasticity
*/
public List<Double> getAxisElasticity() { return Collections.unmodifiableList(axisElasticity); } public List<Double> getAxisElasticity() { return Collections.unmodifiableList(axisElasticity); }
/**
* Gets x elasticity.
*
* @return the x elasticity
*/
public double getXElasticity() { return !axisElasticity.isEmpty() ? axisElasticity.get(0) : 0.8; } public double getXElasticity() { return !axisElasticity.isEmpty() ? axisElasticity.get(0) : 0.8; }
/**
* Gets y elasticity.
*
* @return the y elasticity
*/
public double getYElasticity() { return axisElasticity.size() > 1 ? axisElasticity.get(1) : 0.2; } public double getYElasticity() { return axisElasticity.size() > 1 ? axisElasticity.get(1) : 0.2; }
/**
* Gets z elasticity.
*
* @return the z elasticity
*/
public double getZElasticity() { return axisElasticity.size() > 2 ? axisElasticity.get(2) : 0.8; } public double getZElasticity() { return axisElasticity.size() > 2 ? axisElasticity.get(2) : 0.8; }
/**
* Gets max leashes per entity.
*
* @return the max leashes per entity
*/
public int getMaxLeashesPerEntity() { return maxLeashesPerEntity; } public int getMaxLeashesPerEntity() { return maxLeashesPerEntity; }
/**
* Can entity accept more leashes boolean.
*
* @param entity the entity
* @param currentCount the current count
* @return the boolean
*/
public boolean canEntityAcceptMoreLeashes(Entity entity, int currentCount) { public boolean canEntityAcceptMoreLeashes(Entity entity, int currentCount) {
return currentCount < maxLeashesPerEntity; return currentCount < maxLeashesPerEntity;
} }
// ================== 管理 ================== /**
* Reload all.
*/
// ================== 管理 ==================
public void reloadAll() { public void reloadAll() {
parseOffsetConfig(); parseOffsetConfig();
@ -225,24 +387,47 @@ public class LeashConfigManager {
SuperLeadRope.logger.debug("Configs reloaded: {}", getStats()); SuperLeadRope.logger.debug("Configs reloaded: {}", getStats());
} }
/**
* Clear.
*/
public void clear() { public void clear() {
entityHolderMap.clear(); tagHolderMap.clear(); modHolderMap.clear(); entityHolderMap.clear(); tagHolderMap.clear(); modHolderMap.clear();
entityLeashMap.clear(); tagLeashMap.clear(); modLeashMap.clear(); entityLeashMap.clear(); tagLeashMap.clear(); modLeashMap.clear();
teleportWhitelistCache = Collections.emptyList(); teleportWhitelistCache = Collections.emptyList();
} }
/**
* Loading.
*
* @param manager the manager
*/
public static void loading(LeashConfigManager manager) { public static void loading(LeashConfigManager manager) {
manager.reloadAll(); manager.reloadAll();
} }
/**
* Reloading.
*
* @param manager the manager
*/
public static void reloading(LeashConfigManager manager) { public static void reloading(LeashConfigManager manager) {
manager.reloadAll(); manager.reloadAll();
} }
/**
* Unloading.
*
* @param manager the manager
*/
public static void unloading(LeashConfigManager manager) { public static void unloading(LeashConfigManager manager) {
if(manager != null) manager.clear(); if(manager != null) manager.clear();
} }
/**
* Gets stats.
*
* @return the stats
*/
public String getStats() { public String getStats() {
return String.format( return String.format(
"Holder: Entities: %d, Tags: %d, Mods: %d\nLeash: Entities: %d, Tags: %d, Mods: %d, TeleportWhitelist: %d", "Holder: Entities: %d, Tags: %d, Mods: %d\nLeash: Entities: %d, Tags: %d, Mods: %d, TeleportWhitelist: %d",

View File

@ -20,8 +20,14 @@ import net.minecraft.world.damagesource.DamageScaling;
import net.minecraft.world.damagesource.DamageType; import net.minecraft.world.damagesource.DamageType;
import net.minecraft.world.damagesource.DeathMessageType; import net.minecraft.world.damagesource.DeathMessageType;
/**
* The type Slp damage types.
*/
public class SLPDamageTypes { public class SLPDamageTypes {
// 非绑定主人使用惩罚 /**
* The constant ETERNAL_POTATO_NOT_OWNER.
*/
// 非绑定主人使用惩罚
public static final DamageType ETERNAL_POTATO_NOT_OWNER = public static final DamageType ETERNAL_POTATO_NOT_OWNER =
new DamageType( new DamageType(
"eternal_potato_not_owner", "eternal_potato_not_owner",
@ -30,6 +36,9 @@ public class SLPDamageTypes {
DamageEffects.HURT, DamageEffects.HURT,
DeathMessageType.DEFAULT DeathMessageType.DEFAULT
); );
/**
* The constant ETERNAL_POTATO_NOT_COMPLETE.
*/
public static final DamageType ETERNAL_POTATO_NOT_COMPLETE = public static final DamageType ETERNAL_POTATO_NOT_COMPLETE =
new DamageType( new DamageType(
"eternal_potato_not_complete", "eternal_potato_not_complete",

View File

@ -21,8 +21,17 @@ import net.minecraft.tags.TagKey;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import top.r3944realms.superleadrope.SuperLeadRope; import top.r3944realms.superleadrope.SuperLeadRope;
/**
* The type Slp tags.
*/
public class SLPTags { public class SLPTags {
/**
* The type Items.
*/
public static class Items { public static class Items {
/**
* The constant LEAD.
*/
public static final TagKey<Item> LEAD = tag("lead"); public static final TagKey<Item> LEAD = tag("lead");
private static TagKey<net.minecraft.world.item.Item> tag(String name) private static TagKey<net.minecraft.world.item.Item> tag(String name)
{ {

View File

@ -21,7 +21,13 @@ import org.jetbrains.annotations.NotNull;
import java.util.function.Supplier; import java.util.function.Supplier;
/**
* The enum Slp tool tier.
*/
public enum SLPToolTier implements Tier { public enum SLPToolTier implements Tier {
/**
* String slp tool tier.
*/
STRING(24, 1.0F, 0.0F, 15, () -> Ingredient.of(SLPTags.Items.LEAD)) STRING(24, 1.0F, 0.0F, 15, () -> Ingredient.of(SLPTags.Items.LEAD))
; ;
private final int uses; private final int uses;

View File

@ -32,14 +32,31 @@ import top.r3944realms.superleadrope.content.capability.provider.LeashDataProvid
import top.r3944realms.superleadrope.content.capability.provider.LeashStateProvider; import top.r3944realms.superleadrope.content.capability.provider.LeashStateProvider;
import top.r3944realms.superleadrope.content.item.EternalPotatoItem; import top.r3944realms.superleadrope.content.item.EternalPotatoItem;
/**
* The type Capability handler.
*/
public class CapabilityHandler { public class CapabilityHandler {
/**
* The constant ETERNAL_POTATO_CAP.
*/
public static final Capability<IEternalPotato> ETERNAL_POTATO_CAP = CapabilityManager.get(new CapabilityToken<>() {}); public static final Capability<IEternalPotato> ETERNAL_POTATO_CAP = CapabilityManager.get(new CapabilityToken<>() {});
/**
* Register capability.
*
* @param event the event
*/
public static void registerCapability(@NotNull RegisterCapabilitiesEvent event) { public static void registerCapability(@NotNull RegisterCapabilitiesEvent event) {
event.register(ILeashData.class); event.register(ILeashData.class);
event.register(IEternalPotato.class); event.register(IEternalPotato.class);
event.register(ILeashState.class); event.register(ILeashState.class);
} }
/**
* Attach capability.
*
* @param event the event
*/
public static void attachCapability(@NotNull AttachCapabilitiesEvent<?> event) { public static void attachCapability(@NotNull AttachCapabilitiesEvent<?> event) {
Object object = event.getObject(); Object object = event.getObject();
if(object instanceof Entity entity && if(object instanceof Entity entity &&

View File

@ -20,7 +20,15 @@ import net.minecraft.world.entity.player.Player;
import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerEvent;
import top.r3944realms.superleadrope.util.capability.LeashStateInnerAPI; import top.r3944realms.superleadrope.util.capability.LeashStateInnerAPI;
/**
* The type Capability remainder.
*/
public class CapabilityRemainder { public class CapabilityRemainder {
/**
* On player clone.
*
* @param event the event
*/
public static void onPlayerClone(PlayerEvent.Clone event) { public static void onPlayerClone(PlayerEvent.Clone event) {
Player newEntity = event.getEntity(); Player newEntity = event.getEntity();
if(newEntity instanceof ServerPlayer newPlayer) { if(newEntity instanceof ServerPlayer newPlayer) {

View File

@ -29,6 +29,9 @@ import top.r3944realms.superleadrope.network.toClient.EternalPotatoSyncCapPacket
import java.util.UUID; import java.util.UUID;
/**
* The type Eternal potato.
*/
public class EternalPotatoImpl implements IEternalPotato { public class EternalPotatoImpl implements IEternalPotato {
private ItemStackSync itemStackSync; private ItemStackSync itemStackSync;
private Player boundPlayer; private Player boundPlayer;
@ -51,18 +54,54 @@ public class EternalPotatoImpl implements IEternalPotato {
private PunishmentDefinition punishment = PunishmentDefinition.DEFAULT; private PunishmentDefinition punishment = PunishmentDefinition.DEFAULT;
private IObligationCompletion completionRule = IObligationCompletion.NONE; private IObligationCompletion completionRule = IObligationCompletion.NONE;
// NBT Keys /**
* The constant TAG_LAST_PUNISH_DATE.
*/
// NBT Keys
public static final String TAG_LAST_PUNISH_DATE = "last_punish_date"; public static final String TAG_LAST_PUNISH_DATE = "last_punish_date";
/**
* The constant TAG_PENDING_PUNISHMENTS.
*/
public static final String TAG_PENDING_PUNISHMENTS = "pending_punishments"; public static final String TAG_PENDING_PUNISHMENTS = "pending_punishments";
/**
* The constant TAG_GRACE_PERIOD.
*/
public static final String TAG_GRACE_PERIOD = "grace_period"; public static final String TAG_GRACE_PERIOD = "grace_period";
/**
* The constant TAG_OWNER_UUID.
*/
public static final String TAG_OWNER_UUID = "owner_uuid"; public static final String TAG_OWNER_UUID = "owner_uuid";
/**
* The constant TAG_ITEM_UUID.
*/
public static final String TAG_ITEM_UUID = "item_uuid"; public static final String TAG_ITEM_UUID = "item_uuid";
/**
* The constant TAG_OWNER_NAME.
*/
public static final String TAG_OWNER_NAME = "owner_name"; public static final String TAG_OWNER_NAME = "owner_name";
/**
* The constant TAG_OBLIGATIONS.
*/
public static final String TAG_OBLIGATIONS = "obligations"; public static final String TAG_OBLIGATIONS = "obligations";
/**
* The constant TAG_LAST_RESET.
*/
public static final String TAG_LAST_RESET = "last_reset"; public static final String TAG_LAST_RESET = "last_reset";
/**
* The constant TAG_PUNISHMENT_TYPE.
*/
public static final String TAG_PUNISHMENT_TYPE = "punishment_type"; public static final String TAG_PUNISHMENT_TYPE = "punishment_type";
/**
* The constant TAG_PUNISHMENT_STRENGTH.
*/
public static final String TAG_PUNISHMENT_STRENGTH = "punishment_strength"; public static final String TAG_PUNISHMENT_STRENGTH = "punishment_strength";
/**
* The constant TAG_PUNISHMENT_AFFECT_OTHERS.
*/
public static final String TAG_PUNISHMENT_AFFECT_OTHERS = "punishment_affect_others"; public static final String TAG_PUNISHMENT_AFFECT_OTHERS = "punishment_affect_others";
/**
* The constant TAG_COMPLETION_ID.
*/
public static final String TAG_COMPLETION_ID = "completion_id"; public static final String TAG_COMPLETION_ID = "completion_id";
@Override @Override

View File

@ -104,6 +104,11 @@ public class LeashDataImpl implements ILeashData {
// 引入解决 绳结不保存导致第二进入持有者不存在的问题 // 引入解决 绳结不保存导致第二进入持有者不存在的问题
private final Map<BlockPos, LeashInfo> leashKnots = new ConcurrentHashMap<>(); private final Map<BlockPos, LeashInfo> leashKnots = new ConcurrentHashMap<>();
/**
* Instantiates a new Leash data.
*
* @param entity the entity
*/
public LeashDataImpl(Entity entity) { public LeashDataImpl(Entity entity) {
this.entity = entity; this.entity = entity;
} }
@ -153,6 +158,11 @@ public class LeashDataImpl implements ILeashData {
needsSync = false; needsSync = false;
} }
@Override
public Entity self() {
return entity;
}
@Override @Override
public @Nullable Double getStaticMaxDistance() { public @Nullable Double getStaticMaxDistance() {
return staticMaxDistance; return staticMaxDistance;
@ -399,6 +409,13 @@ public class LeashDataImpl implements ILeashData {
old.maxKeepLeashTicks() old.maxKeepLeashTicks()
)); ));
} }
/**
* Sets max distance inner.
*
* @param holderUUID the holder uuid
* @param newMaxDistance the new max distance
*/
@SuppressWarnings("OptionalGetWithoutIsPresent") @SuppressWarnings("OptionalGetWithoutIsPresent")
public void setMaxDistanceInner(UUID holderUUID, @Nullable Double newMaxDistance) { public void setMaxDistanceInner(UUID holderUUID, @Nullable Double newMaxDistance) {
if (!LeashConfigManager.MAX_DISTANCE_CHECK.test(newMaxDistance)) return; if (!LeashConfigManager.MAX_DISTANCE_CHECK.test(newMaxDistance)) return;
@ -466,6 +483,12 @@ public class LeashDataImpl implements ILeashData {
)); ));
} }
/**
* Sets max distance inner.
*
* @param knotPos the knot pos
* @param newMaxDistance the new max distance
*/
@SuppressWarnings("OptionalGetWithoutIsPresent") @SuppressWarnings("OptionalGetWithoutIsPresent")
public void setMaxDistanceInner(BlockPos knotPos, @Nullable Double newMaxDistance) { public void setMaxDistanceInner(BlockPos knotPos, @Nullable Double newMaxDistance) {
if (!LeashConfigManager.MAX_DISTANCE_CHECK.test(newMaxDistance)) return; if (!LeashConfigManager.MAX_DISTANCE_CHECK.test(newMaxDistance)) return;
@ -540,6 +563,13 @@ public class LeashDataImpl implements ILeashData {
old.maxKeepLeashTicks() old.maxKeepLeashTicks()
)); ));
} }
/**
* Sets elastic distance scale inner.
*
* @param holderUUID the holder uuid
* @param scale the scale
*/
@SuppressWarnings("OptionalGetWithoutIsPresent") @SuppressWarnings("OptionalGetWithoutIsPresent")
public void setElasticDistanceScaleInner(UUID holderUUID, @Nullable Double scale) { public void setElasticDistanceScaleInner(UUID holderUUID, @Nullable Double scale) {
if (!LeashConfigManager.ELASTIC_DISTANCE_CHECK.test(scale)) return; if (!LeashConfigManager.ELASTIC_DISTANCE_CHECK.test(scale)) return;
@ -572,6 +602,13 @@ public class LeashDataImpl implements ILeashData {
old.maxKeepLeashTicks() old.maxKeepLeashTicks()
)); ));
} }
/**
* Sets elastic distance scale inner.
*
* @param knotPos the knot pos
* @param scale the scale
*/
@SuppressWarnings("OptionalGetWithoutIsPresent") @SuppressWarnings("OptionalGetWithoutIsPresent")
public void setElasticDistanceScaleInner(BlockPos knotPos, @Nullable Double scale) { public void setElasticDistanceScaleInner(BlockPos knotPos, @Nullable Double scale) {
if (!LeashConfigManager.ELASTIC_DISTANCE_CHECK.test(scale)) return; if (!LeashConfigManager.ELASTIC_DISTANCE_CHECK.test(scale)) return;
@ -1145,7 +1182,13 @@ public class LeashDataImpl implements ILeashData {
return !leashHolders.isEmpty(); return !leashHolders.isEmpty();
} }
//只能系在这些实体上在这里其它情况一律忽略 /**
* Is leashable boolean.
*
* @param entity the entity
* @return the boolean
*/
//只能系在这些实体上在这里其它情况一律忽略
//TODO: 未来更新计划 - 标签支持控制 //TODO: 未来更新计划 - 标签支持控制
public static boolean isLeashable(Entity entity) { public static boolean isLeashable(Entity entity) {
return entity instanceof LivingEntity || entity instanceof Boat || entity instanceof AbstractMinecart; return entity instanceof LivingEntity || entity instanceof Boat || entity instanceof AbstractMinecart;

View File

@ -40,6 +40,10 @@ import java.util.Optional;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
/**
* The type Leash state.
*/
//TODO: 将拴绳状态与数据联系在一起 //TODO: 将拴绳状态与数据联系在一起
public class LeashStateImpl implements ILeashState { public class LeashStateImpl implements ILeashState {
private Entity entity; private Entity entity;
@ -50,6 +54,13 @@ public class LeashStateImpl implements ILeashState {
@Nullable @Nullable
private volatile Vec3 staticApplyEntityLocationOffset; private volatile Vec3 staticApplyEntityLocationOffset;
private volatile Vec3 defaultApplyEntityLocationOffset; private volatile Vec3 defaultApplyEntityLocationOffset;
/**
* Instantiates a new Leash state.
*
* @param entity the entity
* @param defaultApplyEntityLocationOffset the default apply entity location offset
*/
public LeashStateImpl(Entity entity, Vec3 defaultApplyEntityLocationOffset) { public LeashStateImpl(Entity entity, Vec3 defaultApplyEntityLocationOffset) {
this.entity = entity; this.entity = entity;
this.defaultApplyEntityLocationOffset = defaultApplyEntityLocationOffset; this.defaultApplyEntityLocationOffset = defaultApplyEntityLocationOffset;
@ -91,6 +102,11 @@ public class LeashStateImpl implements ILeashState {
needsSync = false; needsSync = false;
} }
@Override
public Entity self() {
return entity;
}
@Override @Override
public boolean hasLeashState() { public boolean hasLeashState() {
return !leashKnots.isEmpty() || !leashHolders.isEmpty(); return !leashKnots.isEmpty() || !leashHolders.isEmpty();

View File

@ -23,64 +23,240 @@ import top.r3944realms.superleadrope.core.punishment.PunishmentDefinition;
import java.util.UUID; import java.util.UUID;
/**
* The interface Eternal potato.
*/
public interface IEternalPotato { public interface IEternalPotato {
/**
* The interface Item stack sync.
*/
interface ItemStackSync { interface ItemStackSync {
/**
* Mark dirty for item.
*/
void markDirtyForItem(); void markDirtyForItem();
} }
/**
* Bind item stack sync.
*
* @param callback the callback
*/
void bindItemStackSync(ItemStackSync callback); void bindItemStackSync(ItemStackSync callback);
/**
* Begin init.
*/
void beginInit(); void beginInit();
/**
* End init.
*/
void endInit(); void endInit();
/**
* Sets item uuid.
*
* @param uuid the uuid
*/
void setItemUUID(UUID uuid); void setItemUUID(UUID uuid);
/**
* Gets item uuid.
*
* @return the item uuid
*/
UUID getItemUUID(); UUID getItemUUID();
/**
* Sets owner.
*
* @param uuid the uuid
* @param name the name
*/
void setOwner(UUID uuid, String name); void setOwner(UUID uuid, String name);
/**
* Gets owner uuid.
*
* @return the owner uuid
*/
UUID getOwnerUUID(); UUID getOwnerUUID();
/**
* Gets owner name.
*
* @return the owner name
*/
String getOwnerName(); String getOwnerName();
/**
* Sets daily obligations.
*
* @param count the count
*/
void setDailyObligations(int count); void setDailyObligations(int count);
/**
* Gets daily obligations.
*
* @return the daily obligations
*/
int getDailyObligations(); int getDailyObligations();
/**
* Gets pending punishments.
*
* @return the pending punishments
*/
int getPendingPunishments(); int getPendingPunishments();
/**
* Sets pending punishments.
*
* @param count the count
*/
void setPendingPunishments(int count); void setPendingPunishments(int count);
/** /**
* 计算今日总任务次数 = 未完成惩罚次数 + 当日剩余次数 * 计算今日总任务次数 = 未完成惩罚次数 + 当日剩余次数
*
* @return the final task count
*/ */
default int getFinalTaskCount() { default int getFinalTaskCount() {
return getPendingPunishments() + getDailyObligations(); return getPendingPunishments() + getDailyObligations();
} }
/**
* Is network sync non required boolean.
*
* @return the boolean
*/
default boolean isNetworkSyncNonRequired() { default boolean isNetworkSyncNonRequired() {
return !EternalPotatoFacade.isServer(); return !EternalPotatoFacade.isServer();
} }
/**
* Is global effect boolean.
*
* @return the boolean
*/
default boolean isGlobalEffect() { default boolean isGlobalEffect() {
// 根据当前惩罚任务规则决定 // 根据当前惩罚任务规则决定
return getPunishment() != null && getPunishment().affectOthers(); return getPunishment() != null && getPunishment().affectOthers();
} }
/** /**
* 是否在宽限期内 * 是否在宽限期内
*
* @return the boolean
*/ */
default boolean isWithinGracePeriod() { default boolean isWithinGracePeriod() {
return getPendingPunishments() <= getGracePunishments(); return getPendingPunishments() <= getGracePunishments();
} }
/** /**
* 宽限惩罚数 * 宽限惩罚数
*
* @return the grace punishments
*/ */
int getGracePunishments(); int getGracePunishments();
/**
* Sets grace punishments.
*
* @param count the count
*/
void setGracePunishments(int count); void setGracePunishments(int count);
/**
* Sync to client.
*
* @param player the player
*/
void syncToClient(Player player); void syncToClient(Player player);
/**
* Bind sync context.
*
* @param player the player
*/
void bindSyncContext(Player player); void bindSyncContext(Player player);
/**
* Gets bound player.
*
* @return the bound player
*/
Player getBoundPlayer(); Player getBoundPlayer();
/**
* Sets last reset.
*
* @param date the date
*/
void setLastReset(String date); void setLastReset(String date);
/**
* Gets last reset.
*
* @return the last reset
*/
String getLastReset(); String getLastReset();
/**
* Gets punishment.
*
* @return the punishment
*/
PunishmentDefinition getPunishment(); PunishmentDefinition getPunishment();
/**
* Sets punishment.
*
* @param definition the definition
*/
void setPunishment(PunishmentDefinition definition); void setPunishment(PunishmentDefinition definition);
/**
* Sets last punish date.
*
* @param date the date
*/
void setLastPunishDate(String date); void setLastPunishDate(String date);
/**
* Gets last punish date.
*
* @return the last punish date
*/
String getLastPunishDate(); String getLastPunishDate();
/**
* Gets completion rule.
*
* @return the completion rule
*/
IObligationCompletion getCompletionRule(); IObligationCompletion getCompletionRule();
/**
* Sets completion rule.
*
* @param completion the completion
*/
void setCompletionRule(IObligationCompletion completion); void setCompletionRule(IObligationCompletion completion);
/**
* Serialize nbt compound tag.
*
* @return the compound tag
*/
CompoundTag serializeNBT(); CompoundTag serializeNBT();
/**
* Deserialize nbt.
*
* @param nbt the nbt
*/
void deserializeNBT(CompoundTag nbt); void deserializeNBT(CompoundTag nbt);
} }

View File

@ -32,8 +32,14 @@ import top.r3944realms.superleadrope.core.potato.EternalPotatoFacade;
import java.util.UUID; import java.util.UUID;
/**
* The type Eternal potato provider.
*/
public class EternalPotatoProvider implements ICapabilitySerializable<CompoundTag> { public class EternalPotatoProvider implements ICapabilitySerializable<CompoundTag> {
/**
* The constant ETERNAL_POTATO_DATA_REL.
*/
public static final ResourceLocation ETERNAL_POTATO_DATA_REL = public static final ResourceLocation ETERNAL_POTATO_DATA_REL =
new ResourceLocation(SuperLeadRope.MOD_ID, "eternal_potato_data"); new ResourceLocation(SuperLeadRope.MOD_ID, "eternal_potato_data");
@ -44,6 +50,11 @@ public class EternalPotatoProvider implements ICapabilitySerializable<CompoundTa
// 新增引用 ItemStack // 新增引用 ItemStack
private final ItemStack stack; private final ItemStack stack;
/**
* Instantiates a new Eternal potato provider.
*
* @param stack the stack
*/
public EternalPotatoProvider(ItemStack stack) { public EternalPotatoProvider(ItemStack stack) {
this.stack = stack; this.stack = stack;
this.uuid = EternalPotatoItem.getOrCreateItemUUID(stack); this.uuid = EternalPotatoItem.getOrCreateItemUUID(stack);

View File

@ -29,10 +29,22 @@ import top.r3944realms.superleadrope.api.SLPCapability;
import top.r3944realms.superleadrope.api.type.capabilty.ILeashData; import top.r3944realms.superleadrope.api.type.capabilty.ILeashData;
import top.r3944realms.superleadrope.content.capability.impi.LeashDataImpl; import top.r3944realms.superleadrope.content.capability.impi.LeashDataImpl;
/**
* The type Leash data provider.
*/
public class LeashDataProvider implements ICapabilitySerializable<CompoundTag> { public class LeashDataProvider implements ICapabilitySerializable<CompoundTag> {
/**
* The constant LEASH_DATA_REL.
*/
public static final ResourceLocation LEASH_DATA_REL = new ResourceLocation(SuperLeadRope.MOD_ID, "leash_data"); public static final ResourceLocation LEASH_DATA_REL = new ResourceLocation(SuperLeadRope.MOD_ID, "leash_data");
private final ILeashData instance; private final ILeashData instance;
private final LazyOptional<ILeashData> optional; private final LazyOptional<ILeashData> optional;
/**
* Instantiates a new Leash data provider.
*
* @param entity the entity
*/
public LeashDataProvider(Entity entity) { public LeashDataProvider(Entity entity) {
this.instance = new LeashDataImpl(entity); this.instance = new LeashDataImpl(entity);
this.optional = LazyOptional.of(() -> instance); this.optional = LazyOptional.of(() -> instance);

View File

@ -30,10 +30,22 @@ import top.r3944realms.superleadrope.api.SLPCapability;
import top.r3944realms.superleadrope.api.type.capabilty.ILeashState; import top.r3944realms.superleadrope.api.type.capabilty.ILeashState;
import top.r3944realms.superleadrope.content.capability.impi.LeashStateImpl; import top.r3944realms.superleadrope.content.capability.impi.LeashStateImpl;
/**
* The type Leash state provider.
*/
public class LeashStateProvider implements ICapabilitySerializable<CompoundTag> { public class LeashStateProvider implements ICapabilitySerializable<CompoundTag> {
/**
* The constant LEASH_STATE_REL.
*/
public static final ResourceLocation LEASH_STATE_REL = new ResourceLocation(SuperLeadRope.MOD_ID, "leash_state"); public static final ResourceLocation LEASH_STATE_REL = new ResourceLocation(SuperLeadRope.MOD_ID, "leash_state");
private final ILeashState instance; private final ILeashState instance;
private final LazyOptional<ILeashState> optional; private final LazyOptional<ILeashState> optional;
/**
* Instantiates a new Leash state provider.
*
* @param entity the entity
*/
public LeashStateProvider(Entity entity) { public LeashStateProvider(Entity entity) {
this.instance = new LeashStateImpl(entity, CommonEventHandler.leashConfigManager.getDefaultEntityOffset(entity)); this.instance = new LeashStateImpl(entity, CommonEventHandler.leashConfigManager.getDefaultEntityOffset(entity));
this.optional = LazyOptional.of(() -> instance); this.optional = LazyOptional.of(() -> instance);

View File

@ -23,9 +23,27 @@ import top.r3944realms.superleadrope.CommonEventHandler;
import java.util.List; import java.util.List;
/**
* The type Command.
*/
public class Command { public class Command {
/**
* The constant PREFIX.
*/
public static final String PREFIX = CommonEventHandler.leashConfigManager.getCommandPrefix(); public static final String PREFIX = CommonEventHandler.leashConfigManager.getCommandPrefix();
/**
* The constant SHOULD_USE_PREFIX.
*/
public static boolean SHOULD_USE_PREFIX = CommonEventHandler.leashConfigManager.isCommandPrefixEnabled(); public static boolean SHOULD_USE_PREFIX = CommonEventHandler.leashConfigManager.isCommandPrefixEnabled();
/**
* Gets liter argument builder of css.
*
* @param name the name
* @param shouldAddToList the should add to list
* @param list the list
* @return the liter argument builder of css
*/
static LiteralArgumentBuilder<CommandSourceStack> getLiterArgumentBuilderOfCSS(String name, boolean shouldAddToList, @Nullable List<LiteralArgumentBuilder<CommandSourceStack>> list) { static LiteralArgumentBuilder<CommandSourceStack> getLiterArgumentBuilderOfCSS(String name, boolean shouldAddToList, @Nullable List<LiteralArgumentBuilder<CommandSourceStack>> list) {
LiteralArgumentBuilder<CommandSourceStack> literal = Commands.literal(name); LiteralArgumentBuilder<CommandSourceStack> literal = Commands.literal(name);
if (shouldAddToList) { if (shouldAddToList) {

View File

@ -47,18 +47,58 @@ import java.util.List;
import java.util.Optional; import java.util.Optional;
import static top.r3944realms.superleadrope.content.command.Command.*; import static top.r3944realms.superleadrope.content.command.Command.*;
/**
* The type Leash data command.
*/
public class LeashDataCommand { public class LeashDataCommand {
/**
* The constant SLP_LEASH_MESSAGE_.
*/
public static final String SLP_LEASH_MESSAGE_ = SuperLeadRope.MOD_ID + ".command.leash.message."; public static final String SLP_LEASH_MESSAGE_ = SuperLeadRope.MOD_ID + ".command.leash.message.";
/**
* The constant LEASH_DATA_GET_.
*/
public static final String LEASH_DATA_GET_ = SLP_LEASH_MESSAGE_ + ".get.", public static final String LEASH_DATA_GET_ = SLP_LEASH_MESSAGE_ + ".get.",
TITLE = LEASH_DATA_GET_ + "title", /**
TOTAL = LEASH_DATA_GET_ + "total", * The Title.
BLOCK = LEASH_DATA_GET_ + "block", */
UUID = LEASH_DATA_GET_ + "uuid", TITLE = LEASH_DATA_GET_ + "title",
MAX = LEASH_DATA_GET_ + "max", /**
ELASTIC = LEASH_DATA_GET_ + "elastic", * The Total.
KEEP = LEASH_DATA_GET_ + "keep", */
RESERVED = LEASH_DATA_GET_ + "reserved" TOTAL = LEASH_DATA_GET_ + "total",
/**
* The Block.
*/
BLOCK = LEASH_DATA_GET_ + "block",
/**
* The Uuid.
*/
UUID = LEASH_DATA_GET_ + "uuid",
/**
* The Max.
*/
MAX = LEASH_DATA_GET_ + "max",
/**
* The Elastic.
*/
ELASTIC = LEASH_DATA_GET_ + "elastic",
/**
* The Keep.
*/
KEEP = LEASH_DATA_GET_ + "keep",
/**
* The Reserved.
*/
RESERVED = LEASH_DATA_GET_ + "reserved"
; ;
/**
* Register.
*
* @param dispatcher the dispatcher
*/
public static void register(CommandDispatcher<CommandSourceStack> dispatcher) { public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {
@Nullable List<LiteralArgumentBuilder<CommandSourceStack>> nodeList = SHOULD_USE_PREFIX ? null : new ArrayList<>(); @Nullable List<LiteralArgumentBuilder<CommandSourceStack>> nodeList = SHOULD_USE_PREFIX ? null : new ArrayList<>();
LiteralArgumentBuilder<CommandSourceStack> literalArgumentBuilder = Commands.literal(PREFIX); LiteralArgumentBuilder<CommandSourceStack> literalArgumentBuilder = Commands.literal(PREFIX);
@ -283,6 +323,10 @@ public class LeashDataCommand {
} }
} }
} }
/**
* The constant SET_MAX_DISTANCE.
*/
public static final String SET_MAX_DISTANCE = SLP_LEASH_MESSAGE_ + "set_apply_entity.max_distance"; public static final String SET_MAX_DISTANCE = SLP_LEASH_MESSAGE_ + "set_apply_entity.max_distance";
private static int setMaxDistance(CommandContext<CommandSourceStack> context) throws CommandSyntaxException { private static int setMaxDistance(CommandContext<CommandSourceStack> context) throws CommandSyntaxException {
return setMaxDistance(context, CommonEventHandler.leashConfigManager.getMaxLeashLength(), ""); return setMaxDistance(context, CommonEventHandler.leashConfigManager.getMaxLeashLength(), "");
@ -298,14 +342,26 @@ public class LeashDataCommand {
} }
return -1; return -1;
} }
/**
* The constant REMOVE_ALL_BLOCK_LEASHES.
*/
public static final String REMOVE_ALL_BLOCK_LEASHES = SLP_LEASH_MESSAGE_ + "remove_apply_entity.all_block_leashes"; public static final String REMOVE_ALL_BLOCK_LEASHES = SLP_LEASH_MESSAGE_ + "remove_apply_entity.all_block_leashes";
private static int removeAllBlockLeashes(CommandContext<CommandSourceStack> context) throws CommandSyntaxException { private static int removeAllBlockLeashes(CommandContext<CommandSourceStack> context) throws CommandSyntaxException {
return -1; return -1;
} }
/**
* The constant REMOVE_ALL_HOLDER_LEASHES.
*/
public static final String REMOVE_ALL_HOLDER_LEASHES = SLP_LEASH_MESSAGE_ + "remove_apply_entity.all_holder_leashes"; public static final String REMOVE_ALL_HOLDER_LEASHES = SLP_LEASH_MESSAGE_ + "remove_apply_entity.all_holder_leashes";
private static int removeAllHolderLeashes(CommandContext<CommandSourceStack> context) throws CommandSyntaxException { private static int removeAllHolderLeashes(CommandContext<CommandSourceStack> context) throws CommandSyntaxException {
return -1; return -1;
} }
/**
* The constant TRANSFER_FROM_BLOCK.
*/
public static final String TRANSFER_FROM_BLOCK = SLP_LEASH_MESSAGE_ + "transfer.from_block"; public static final String TRANSFER_FROM_BLOCK = SLP_LEASH_MESSAGE_ + "transfer.from_block";
private static int transferFromBlock(CommandContext<CommandSourceStack> context) throws CommandSyntaxException { private static int transferFromBlock(CommandContext<CommandSourceStack> context) throws CommandSyntaxException {
return transferFromBlock(context, ""); return transferFromBlock(context, "");
@ -313,6 +369,10 @@ public class LeashDataCommand {
private static int transferFromBlock(CommandContext<CommandSourceStack> context, String reserved) throws CommandSyntaxException { private static int transferFromBlock(CommandContext<CommandSourceStack> context, String reserved) throws CommandSyntaxException {
return -1; return -1;
} }
/**
* The constant SET_ELASTIC_DISTANCE.
*/
public static final String SET_ELASTIC_DISTANCE = SLP_LEASH_MESSAGE_ + "set_apply_entity.elastic_distance"; public static final String SET_ELASTIC_DISTANCE = SLP_LEASH_MESSAGE_ + "set_apply_entity.elastic_distance";
private static int setElasticDistance(CommandContext<CommandSourceStack> context) throws CommandSyntaxException { private static int setElasticDistance(CommandContext<CommandSourceStack> context) throws CommandSyntaxException {
return setElasticDistance(context, 0 ,""); return setElasticDistance(context, 0 ,"");
@ -323,6 +383,10 @@ public class LeashDataCommand {
private static int setElasticDistance(CommandContext<CommandSourceStack> context, int keepTicks, String reserved) throws CommandSyntaxException { private static int setElasticDistance(CommandContext<CommandSourceStack> context, int keepTicks, String reserved) throws CommandSyntaxException {
return -1; return -1;
} }
/**
* The constant SET_BLOCK_MAX_DISTANCE.
*/
public static final String SET_BLOCK_MAX_DISTANCE = SLP_LEASH_MESSAGE_ + "set_apply_entity.block_max_distance"; public static final String SET_BLOCK_MAX_DISTANCE = SLP_LEASH_MESSAGE_ + "set_apply_entity.block_max_distance";
private static int setBlockMaxDistance(CommandContext<CommandSourceStack> context) throws CommandSyntaxException { private static int setBlockMaxDistance(CommandContext<CommandSourceStack> context) throws CommandSyntaxException {
return setBlockMaxDistance(context, 0 ,""); return setBlockMaxDistance(context, 0 ,"");
@ -333,6 +397,10 @@ public class LeashDataCommand {
private static int setBlockMaxDistance(CommandContext<CommandSourceStack> context, int keepTicks, String reserved) throws CommandSyntaxException { private static int setBlockMaxDistance(CommandContext<CommandSourceStack> context, int keepTicks, String reserved) throws CommandSyntaxException {
return -1; return -1;
} }
/**
* The constant SET_BLOCK_ELASTIC_DISTANCE.
*/
public static final String SET_BLOCK_ELASTIC_DISTANCE = SLP_LEASH_MESSAGE_ + "set_apply_entity.block_elastic_distance"; public static final String SET_BLOCK_ELASTIC_DISTANCE = SLP_LEASH_MESSAGE_ + "set_apply_entity.block_elastic_distance";
private static int setBlockElasticDistance(CommandContext<CommandSourceStack> context) throws CommandSyntaxException { private static int setBlockElasticDistance(CommandContext<CommandSourceStack> context) throws CommandSyntaxException {
return setBlockElasticDistance(context, 0 ,""); return setBlockElasticDistance(context, 0 ,"");

View File

@ -18,8 +18,16 @@ package top.r3944realms.superleadrope.content.command;
import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.CommandDispatcher;
import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.CommandSourceStack;
/**
* The type Leash state command.
*/
public class LeashStateCommand { public class LeashStateCommand {
// 获取State /**
* Register.
*
* @param dispatcher the dispatcher
*/
// 获取State
// 设置State // 设置State
// <addApplyEntity/setApplyEntity/reset> Holder<BlockPos/Entity<需判断实体类型>> <Holder/Entity> <x> <y> <z> // <addApplyEntity/setApplyEntity/reset> Holder<BlockPos/Entity<需判断实体类型>> <Holder/Entity> <x> <y> <z>
// 设置对应目标的 拴绳偏移 // 设置对应目标的 拴绳偏移

View File

@ -37,11 +37,29 @@ import java.util.List;
import static top.r3944realms.superleadrope.content.command.Command.*; import static top.r3944realms.superleadrope.content.command.Command.*;
/**
* The type Motion command.
*/
public class MotionCommand { public class MotionCommand {
private final static String SLP_MOTION_MESSAGE_ = SuperLeadRope.MOD_ID + ".command.motion.message."; private final static String SLP_MOTION_MESSAGE_ = SuperLeadRope.MOD_ID + ".command.motion.message.";
/**
* The constant MOTION_SETTER_SUCCESSFUL.
*/
public final static String MOTION_SETTER_SUCCESSFUL = SLP_MOTION_MESSAGE_ + "setter.successful", public final static String MOTION_SETTER_SUCCESSFUL = SLP_MOTION_MESSAGE_ + "setter.successful",
MOTION_ADDER_SUCCESSFUL = SLP_MOTION_MESSAGE_ + "adder.successful", /**
MOTION_MULTIPLY_SUCCESSFUL = SLP_MOTION_MESSAGE_ + "multiply.successful"; * The Motion adder successful.
*/
MOTION_ADDER_SUCCESSFUL = SLP_MOTION_MESSAGE_ + "adder.successful",
/**
* The Motion multiply successful.
*/
MOTION_MULTIPLY_SUCCESSFUL = SLP_MOTION_MESSAGE_ + "multiply.successful";
/**
* Register.
*
* @param dispatcher the dispatcher
*/
public static void register(CommandDispatcher<CommandSourceStack> dispatcher) { public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {
@Nullable List<LiteralArgumentBuilder<CommandSourceStack>> nodeList = SHOULD_USE_PREFIX ? null : new ArrayList<>(); @Nullable List<LiteralArgumentBuilder<CommandSourceStack>> nodeList = SHOULD_USE_PREFIX ? null : new ArrayList<>();
LiteralArgumentBuilder<CommandSourceStack> literalArgumentBuilder = Commands.literal(PREFIX); LiteralArgumentBuilder<CommandSourceStack> literalArgumentBuilder = Commands.literal(PREFIX);

View File

@ -43,6 +43,9 @@ import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
/**
* The type Super leash knot entity.
*/
public class SuperLeashKnotEntity extends LeashFenceKnotEntity { public class SuperLeashKnotEntity extends LeashFenceKnotEntity {
// 默认尺寸 // 默认尺寸
private static final float DEFAULT_WIDTH = 0.5f; private static final float DEFAULT_WIDTH = 0.5f;
@ -58,11 +61,23 @@ public class SuperLeashKnotEntity extends LeashFenceKnotEntity {
BlockTags.WALLS BlockTags.WALLS
); );
/**
* Instantiates a new Super leash knot entity.
*
* @param pEntityType the p entity type
* @param pLevel the p level
*/
public SuperLeashKnotEntity(EntityType<? extends SuperLeashKnotEntity> pEntityType, Level pLevel) { public SuperLeashKnotEntity(EntityType<? extends SuperLeashKnotEntity> pEntityType, Level pLevel) {
super(pEntityType, pLevel); super(pEntityType, pLevel);
} }
/**
* Instantiates a new Super leash knot entity.
*
* @param pLevel the p level
* @param pPos the p pos
*/
public SuperLeashKnotEntity(Level pLevel, BlockPos pPos) { public SuperLeashKnotEntity(Level pLevel, BlockPos pPos) {
this(SLPEntityTypes.SUPER_LEAD_KNOT.get(), pLevel); this(SLPEntityTypes.SUPER_LEAD_KNOT.get(), pLevel);
this.setPos(pPos.getX(), pPos.getY(), pPos.getZ()); this.setPos(pPos.getX(), pPos.getY(), pPos.getZ());
@ -103,6 +118,13 @@ public class SuperLeashKnotEntity extends LeashFenceKnotEntity {
return supportBlock; return supportBlock;
} }
/**
* Gets or create knot.
*
* @param pLevel the p level
* @param pPos the p pos
* @return the or create knot
*/
public static @NotNull SuperLeashKnotEntity getOrCreateKnot(@NotNull Level pLevel, @NotNull BlockPos pPos) { public static @NotNull SuperLeashKnotEntity getOrCreateKnot(@NotNull Level pLevel, @NotNull BlockPos pPos) {
int i = pPos.getX(); int i = pPos.getX();
int j = pPos.getY(); int j = pPos.getY();
@ -126,6 +148,14 @@ public class SuperLeashKnotEntity extends LeashFenceKnotEntity {
pLevel.addFreshEntity(superLeashKnotEntity1); pLevel.addFreshEntity(superLeashKnotEntity1);
return superLeashKnotEntity1; return superLeashKnotEntity1;
} }
/**
* Get optional.
*
* @param level the level
* @param pos the pos
* @return the optional
*/
public static @NotNull Optional<SuperLeashKnotEntity> get(@NotNull Level level, @NotNull BlockPos pos) { public static @NotNull Optional<SuperLeashKnotEntity> get(@NotNull Level level, @NotNull BlockPos pos) {
AABB searchArea = new AABB(pos).inflate(1.0D); AABB searchArea = new AABB(pos).inflate(1.0D);
@ -137,7 +167,11 @@ public class SuperLeashKnotEntity extends LeashFenceKnotEntity {
/** /**
* 创建拴绳结请不用直接调用这个除非你知道自己在干上面 * 创建拴绳结请不用直接调用这个除非你知道自己在干上面
* @return 拴绳结 *
* @param pLevel the p level
* @param pPos the p pos
* @param isEmpty the is empty
* @return 拴绳结 super leash knot entity
*/ */
public static @NotNull SuperLeashKnotEntity createKnot(@NotNull Level pLevel, @NotNull BlockPos pPos, boolean isEmpty) { public static @NotNull SuperLeashKnotEntity createKnot(@NotNull Level pLevel, @NotNull BlockPos pPos, boolean isEmpty) {
if(isEmpty) { if(isEmpty) {
@ -179,6 +213,12 @@ public class SuperLeashKnotEntity extends LeashFenceKnotEntity {
//TODO: 未来扩展可配置化大小 //TODO: 未来扩展可配置化大小
} }
/**
* Is support block boolean.
*
* @param state the state
* @return the boolean
*/
public static boolean isSupportBlock(BlockState state) { public static boolean isSupportBlock(BlockState state) {
for(TagKey<Block> tagKey : SUPPORTED_BLOCK) { for(TagKey<Block> tagKey : SUPPORTED_BLOCK) {
if(state.is(tagKey)) { if(state.is(tagKey)) {

View File

@ -19,25 +19,77 @@ import top.r3944realms.superleadrope.core.register.SLPGameruleRegistry;
import java.util.HashMap; import java.util.HashMap;
/**
* The type Slp gamerules.
*/
public class SLPGamerules { public class SLPGamerules {
/**
* The constant GAMERULE_PREFIX.
*/
public static final String GAMERULE_PREFIX = "SLP."; public static final String GAMERULE_PREFIX = "SLP.";
/**
* The constant GAMERULE_REGISTRY.
*/
public static final SLPGameruleRegistry GAMERULE_REGISTRY = SLPGameruleRegistry.INSTANCE; public static final SLPGameruleRegistry GAMERULE_REGISTRY = SLPGameruleRegistry.INSTANCE;
/**
* The constant gamerulesBooleanValuesClient.
*/
public static final HashMap<String, Boolean> gamerulesBooleanValuesClient = new HashMap<>(); public static final HashMap<String, Boolean> gamerulesBooleanValuesClient = new HashMap<>();
/**
* The constant gameruleIntegerValuesClient.
*/
public static final HashMap<String, Integer> gameruleIntegerValuesClient = new HashMap<>(); public static final HashMap<String, Integer> gameruleIntegerValuesClient = new HashMap<>();
/**
* The constant RULE_KEY_PERFiX_.
*/
public static final String RULE_KEY_PERFiX_ = "gamerule." + GAMERULE_PREFIX; public static final String RULE_KEY_PERFiX_ = "gamerule." + GAMERULE_PREFIX;
/**
* Gets description key.
*
* @param gameRuleClass the game rule class
* @return the description key
*/
public static String getDescriptionKey(Class<?> gameRuleClass) { public static String getDescriptionKey(Class<?> gameRuleClass) {
return RULE_KEY_PERFiX_ + gameRuleClass.getSimpleName() + ".description"; return RULE_KEY_PERFiX_ + gameRuleClass.getSimpleName() + ".description";
} }
/**
* Gets description key.
*
* @param gameRuleName the game rule name
* @return the description key
*/
public static String getDescriptionKey(String gameRuleName) { public static String getDescriptionKey(String gameRuleName) {
return RULE_KEY_PERFiX_ + gameRuleName + ".description"; return RULE_KEY_PERFiX_ + gameRuleName + ".description";
} }
/**
* Gets gamerule name.
*
* @param clazz the clazz
* @return the gamerule name
*/
public static String getGameruleName(Class<?> clazz) { public static String getGameruleName(Class<?> clazz) {
return SLPGamerules.GAMERULE_PREFIX + clazz.getSimpleName(); return SLPGamerules.GAMERULE_PREFIX + clazz.getSimpleName();
} }
/**
* Gets gamerule name.
*
* @param gamerulesName the gamerules name
* @return the gamerule name
*/
public static String getGameruleName(String gamerulesName) { public static String getGameruleName(String gamerulesName) {
return SLPGamerules.GAMERULE_PREFIX + gamerulesName; return SLPGamerules.GAMERULE_PREFIX + gamerulesName;
} }
/**
* Gets name key.
*
* @param gameRuleClass the game rule class
* @return the name key
*/
public static String getNameKey(Class<?> gameRuleClass) { public static String getNameKey(Class<?> gameRuleClass) {
return RULE_KEY_PERFiX_ + gameRuleClass.getSimpleName(); return RULE_KEY_PERFiX_ + gameRuleClass.getSimpleName();
} }

View File

@ -20,13 +20,34 @@ import top.r3944realms.superleadrope.content.gamerule.SLPGamerules;
import static top.r3944realms.superleadrope.content.gamerule.SLPGamerules.GAMERULE_REGISTRY; import static top.r3944realms.superleadrope.content.gamerule.SLPGamerules.GAMERULE_REGISTRY;
/**
* The type Create super leash knot entity if absent.
*/
public class CreateSuperLeashKnotEntityIfAbsent { public class CreateSuperLeashKnotEntityIfAbsent {
/**
* The constant DEFAULT_VALUE.
*/
public static final boolean DEFAULT_VALUE = true; public static final boolean DEFAULT_VALUE = true;
/**
* The constant ID.
*/
public static final String ID = SLPGamerules.getGameruleName(CreateSuperLeashKnotEntityIfAbsent.class); public static final String ID = SLPGamerules.getGameruleName(CreateSuperLeashKnotEntityIfAbsent.class);
/**
* The constant DESCRIPTION_KEY.
*/
public static final String DESCRIPTION_KEY = SLPGamerules.getDescriptionKey(CreateSuperLeashKnotEntityIfAbsent.class); public static final String DESCRIPTION_KEY = SLPGamerules.getDescriptionKey(CreateSuperLeashKnotEntityIfAbsent.class);
/**
* The constant NAME_KEY.
*/
public static final String NAME_KEY = SLPGamerules.getNameKey(CreateSuperLeashKnotEntityIfAbsent.class); public static final String NAME_KEY = SLPGamerules.getNameKey(CreateSuperLeashKnotEntityIfAbsent.class);
/**
* The constant CATEGORY.
*/
public static final GameRules.Category CATEGORY = GameRules.Category.PLAYER; public static final GameRules.Category CATEGORY = GameRules.Category.PLAYER;
/**
* Register.
*/
public static void register() { public static void register() {
GAMERULE_REGISTRY.registerGamerule(ID, CATEGORY, DEFAULT_VALUE); GAMERULE_REGISTRY.registerGamerule(ID, CATEGORY, DEFAULT_VALUE);
} }

View File

@ -20,13 +20,34 @@ import top.r3944realms.superleadrope.content.gamerule.SLPGamerules;
import static top.r3944realms.superleadrope.content.gamerule.SLPGamerules.GAMERULE_REGISTRY; import static top.r3944realms.superleadrope.content.gamerule.SLPGamerules.GAMERULE_REGISTRY;
/**
* The type Teleport with leashed entities.
*/
public class TeleportWithLeashedEntities { public class TeleportWithLeashedEntities {
/**
* The constant DEFAULT_VALUE.
*/
public static final boolean DEFAULT_VALUE = true; public static final boolean DEFAULT_VALUE = true;
/**
* The constant ID.
*/
public static final String ID = SLPGamerules.getGameruleName(TeleportWithLeashedEntities.class); public static final String ID = SLPGamerules.getGameruleName(TeleportWithLeashedEntities.class);
/**
* The constant DESCRIPTION_KEY.
*/
public static final String DESCRIPTION_KEY = SLPGamerules.getDescriptionKey(TeleportWithLeashedEntities.class); public static final String DESCRIPTION_KEY = SLPGamerules.getDescriptionKey(TeleportWithLeashedEntities.class);
/**
* The constant NAME_KEY.
*/
public static final String NAME_KEY = SLPGamerules.getNameKey(TeleportWithLeashedEntities.class); public static final String NAME_KEY = SLPGamerules.getNameKey(TeleportWithLeashedEntities.class);
/**
* The constant CATEGORY.
*/
public static final GameRules.Category CATEGORY = GameRules.Category.PLAYER; public static final GameRules.Category CATEGORY = GameRules.Category.PLAYER;
/**
* Register.
*/
public static void register() { public static void register() {
GAMERULE_REGISTRY.registerGamerule(ID, CATEGORY, DEFAULT_VALUE); GAMERULE_REGISTRY.registerGamerule(ID, CATEGORY, DEFAULT_VALUE);
} }

View File

@ -42,10 +42,18 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.UUID; import java.util.UUID;
/**
* The type Eternal potato item.
*/
public class EternalPotatoItem extends Item { public class EternalPotatoItem extends Item {
private static final String ITEM_UUID_TAG = "item_uuid"; private static final String ITEM_UUID_TAG = "item_uuid";
/**
* Instantiates a new Eternal potato item.
*
* @param properties the properties
*/
public EternalPotatoItem(Properties properties) { public EternalPotatoItem(Properties properties) {
super(properties.rarity(Rarity.EPIC).stacksTo(1)); super(properties.rarity(Rarity.EPIC).stacksTo(1));
} }
@ -55,7 +63,11 @@ public class EternalPotatoItem extends Item {
return new EternalPotatoProvider(stack); return new EternalPotatoProvider(stack);
} }
/** 获取或生成 ItemStack 的唯一 UUID */ /**
* 获取或生成 ItemStack 的唯一 UUID @param stack the stack
*
* @return the or create item uuid
*/
public static UUID getOrCreateItemUUID(ItemStack stack) { public static UUID getOrCreateItemUUID(ItemStack stack) {
CompoundTag tag = stack.getOrCreateTag(); CompoundTag tag = stack.getOrCreateTag();
if (tag.hasUUID(ITEM_UUID_TAG)) { if (tag.hasUUID(ITEM_UUID_TAG)) {
@ -178,10 +190,22 @@ public class EternalPotatoItem extends Item {
return stack.copy(); return stack.copy();
} }
/**
* Gets desc key.
*
* @param name the name
* @return the desc key
*/
public static String getDescKey(String name) { public static String getDescKey(String name) {
return "item.eternal_potato.tooltip." + name; return "item.eternal_potato.tooltip." + name;
} }
/**
* Gets msg key.
*
* @param name the name
* @return the msg key
*/
public static String getMsgKey(String name) { public static String getMsgKey(String name) {
return "item.eternal_potato.msg." + name; return "item.eternal_potato.msg." + name;
} }
@ -213,6 +237,12 @@ public class EternalPotatoItem extends Item {
// } // }
} }
/**
* Ensure item in inventory.
*
* @param player the player
* @param stack the stack
*/
public static void ensureItemInInventory(Player player, ItemStack stack) { public static void ensureItemInInventory(Player player, ItemStack stack) {
if (player.getInventory().add(stack)) return; if (player.getInventory().add(stack)) return;

View File

@ -42,6 +42,9 @@ import java.util.Optional;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
/**
* The type Super lead rope item.
*/
//TODO: //TODO:
// 1. 可抛掷使用 ***下个版本实现 // 1. 可抛掷使用 ***下个版本实现
// - 可转移拴绳 // - 可转移拴绳
@ -60,6 +63,11 @@ public class SuperLeadRopeItem extends TieredItem implements IForgeItem {
private static final float THROW_SPEED = 1.5F; private static final float THROW_SPEED = 1.5F;
/**
* Instantiates a new Super lead rope item.
*
* @param pProperties the p properties
*/
public SuperLeadRopeItem(@NotNull Properties pProperties) { public SuperLeadRopeItem(@NotNull Properties pProperties) {
super(SLPToolTier.STRING, super(SLPToolTier.STRING,
pProperties pProperties
@ -80,6 +88,12 @@ public class SuperLeadRopeItem extends TieredItem implements IForgeItem {
return InteractionResultHolder.success(lead); return InteractionResultHolder.success(lead);
} }
/**
* Can use boolean.
*
* @param itemStack the item stack
* @return the boolean
*/
public static boolean canUse(@NotNull ItemStack itemStack) { public static boolean canUse(@NotNull ItemStack itemStack) {
return itemStack.getDamageValue() < 1000; return itemStack.getDamageValue() < 1000;
} }
@ -99,23 +113,27 @@ public class SuperLeadRopeItem extends TieredItem implements IForgeItem {
} }
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} }
/** /**
* 右键蹲下绑定到另一实体上 * 右键蹲下绑定到另一实体上
*
* @param newHolder 新实体 * @param newHolder 新实体
* @param player 明确持有玩家 * @param player 明确持有玩家
* @param level 维度世界 * @param level 维度世界
* @return 是否成功 * @return 是否成功 boolean
*/ */
public static boolean bindToEntity(Entity newHolder, Player player, Level level) { public static boolean bindToEntity(Entity newHolder, Player player, Level level) {
return bindToEntity(newHolder, player, level, player.getOnPos()); return bindToEntity(newHolder, player, level, player.getOnPos());
} }
/** /**
* 右键蹲下绑定到另一实体上 * 右键蹲下绑定到另一实体上
*
* @param newHolder 新实体 * @param newHolder 新实体
* @param player 明确持有玩家 * @param player 明确持有玩家
* @param level 维度世界 * @param level 维度世界
* @param pos 坐标一般是明确持有玩家的位置 * @param pos 坐标一般是明确持有玩家的位置
* @return 是否成功 * @return 是否成功 boolean
*/ */
public static boolean bindToEntity(Entity newHolder, Player player, Level level, BlockPos pos) { public static boolean bindToEntity(Entity newHolder, Player player, Level level, BlockPos pos) {
boolean isSuccess = false; boolean isSuccess = false;
@ -146,15 +164,17 @@ public class SuperLeadRopeItem extends TieredItem implements IForgeItem {
/** /**
* 右键蹲下绑定到支持方块上 * 右键蹲下绑定到支持方块上
* @param player 明确持有玩家 *
* @param level 维度世界 * @param player 明确持有玩家
* @param leashStack 拴绳物品实例 * @param level 维度世界
* @param leashStack 拴绳物品实例
* @param shouldBindSelf 是否应该触发拴自己逻辑检查 * @param shouldBindSelf 是否应该触发拴自己逻辑检查
* @return 是否成功 * @return 是否成功 boolean
*/ */
public static boolean bindToBlock(Player player, Level level, ItemStack leashStack, boolean shouldBindSelf) { public static boolean bindToBlock(Player player, Level level, ItemStack leashStack, boolean shouldBindSelf) {
return bindToBlock(player, level, player.getOnPos(), leashStack, shouldBindSelf); return bindToBlock(player, level, player.getOnPos(), leashStack, shouldBindSelf);
} }
/** /**
* 右键蹲下绑定到支持方块上 * 右键蹲下绑定到支持方块上
* *
@ -163,7 +183,7 @@ public class SuperLeadRopeItem extends TieredItem implements IForgeItem {
* @param pos 坐标一般是明确持有玩家的位置 * @param pos 坐标一般是明确持有玩家的位置
* @param leashStack 拴绳物品实例 * @param leashStack 拴绳物品实例
* @param shouldBindSelf 是否应该触发拴自己逻辑检查 * @param shouldBindSelf 是否应该触发拴自己逻辑检查
* @return 是否成功 * @return 是否成功 boolean
*/ */
public static boolean bindToBlock(Player player, Level level, BlockPos pos, ItemStack leashStack, boolean shouldBindSelf) { public static boolean bindToBlock(Player player, Level level, BlockPos pos, ItemStack leashStack, boolean shouldBindSelf) {
SuperLeashKnotEntity knot = null; SuperLeashKnotEntity knot = null;

View File

@ -17,10 +17,19 @@ package top.r3944realms.superleadrope.core.exception;
import java.util.UUID; import java.util.UUID;
/**
* The type Riding cycle exception.
*/
public class RidingCycleException extends IllegalStateException { public class RidingCycleException extends IllegalStateException {
private final UUID entityId; private final UUID entityId;
private final UUID vehicleId; private final UUID vehicleId;
/**
* Instantiates a new Riding cycle exception.
*
* @param entityId the entity id
* @param vehicleId the vehicle id
*/
public RidingCycleException(UUID entityId, UUID vehicleId) { public RidingCycleException(UUID entityId, UUID vehicleId) {
super(String.format("Cyclic riding reference detected. " + super(String.format("Cyclic riding reference detected. " +
"Entity %s cannot be added as passenger to vehicle %s " + "Entity %s cannot be added as passenger to vehicle %s " +
@ -30,10 +39,20 @@ public class RidingCycleException extends IllegalStateException {
this.vehicleId = vehicleId; this.vehicleId = vehicleId;
} }
/**
* Gets entity id.
*
* @return the entity id
*/
public UUID getEntityId() { public UUID getEntityId() {
return entityId; return entityId;
} }
/**
* Gets vehicle id.
*
* @return the vehicle id
*/
public UUID getVehicleId() { public UUID getVehicleId() {
return vehicleId; return vehicleId;
} }

View File

@ -24,7 +24,17 @@ import top.r3944realms.superleadrope.util.capability.LeashDataInnerAPI;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
/**
* The type Leash render hook.
*/
public class LeashRenderHook { public class LeashRenderHook {
/**
* Should render extra boolean.
*
* @param mob the mob
* @param camera the camera
* @return the boolean
*/
public static boolean shouldRenderExtra(Mob mob, Frustum camera) { public static boolean shouldRenderExtra(Mob mob, Frustum camera) {
SuperLeadRope.logger.debug("[SuperLeash] Checking entity: {} at position: {}, {}, {}", mob.getName().getString(), mob.getX(), mob.getY(), mob.getZ()); SuperLeadRope.logger.debug("[SuperLeash] Checking entity: {} at position: {}, {}, {}", mob.getName().getString(), mob.getX(), mob.getY(), mob.getZ());
AtomicBoolean flag = new AtomicBoolean(false); AtomicBoolean flag = new AtomicBoolean(false);

View File

@ -37,8 +37,20 @@ import top.r3944realms.superleadrope.util.capability.LeashDataInnerAPI;
import java.util.Optional; import java.util.Optional;
/**
* The type Leash interact handler.
*/
public class LeashInteractHandler { public class LeashInteractHandler {
//只有玩家可以互动触发其它的暂不支持考虑到0 Mixin) /**
* On entity right interact.
*
* @param level the level
* @param hand the hand
* @param target the target
* @param player the player
* @param event the event
*/
//只有玩家可以互动触发其它的暂不支持考虑到0 Mixin)
public static void onEntityRightInteract(Level level, InteractionHand hand, Entity target , Player player, PlayerInteractEvent.EntityInteract event) { public static void onEntityRightInteract(Level level, InteractionHand hand, Entity target , Player player, PlayerInteractEvent.EntityInteract event) {
//WARNING: 主手和副手都会触发一次该事件 //WARNING: 主手和副手都会触发一次该事件
@ -119,6 +131,15 @@ public class LeashInteractHandler {
} }
} }
/**
* On entity left interact.
*
* @param level the level
* @param target the target
* @param player the player
* @param event the event
*/
public static void onEntityLeftInteract(Level level, Entity target , Player player, AttackEntityEvent event) { public static void onEntityLeftInteract(Level level, Entity target , Player player, AttackEntityEvent event) {
boolean flag = LeashDataImpl.isLeashable(target) && player.getItemInHand(InteractionHand.MAIN_HAND).is(SLPItems.SUPER_LEAD_ROPE.get()); boolean flag = LeashDataImpl.isLeashable(target) && player.getItemInHand(InteractionHand.MAIN_HAND).is(SLPItems.SUPER_LEAD_ROPE.get());
if (level.isClientSide) { if (level.isClientSide) {

View File

@ -23,28 +23,79 @@ import java.util.Set;
import java.util.WeakHashMap; import java.util.WeakHashMap;
import java.util.function.Consumer; import java.util.function.Consumer;
/**
* The type Leash sync manager.
*/
// 全局LeashData同步管理器 // 全局LeashData同步管理器
public class LeashSyncManager { public class LeashSyncManager {
/**
* The Leash data.
*/
static final Set<ILeashData> LEASH_DATA = Collections.newSetFromMap(new WeakHashMap<>()); static final Set<ILeashData> LEASH_DATA = Collections.newSetFromMap(new WeakHashMap<>());
/**
* The Leash states.
*/
static final Set<ILeashState> LEASH_STATES = Collections.newSetFromMap(new WeakHashMap<>()); static final Set<ILeashState> LEASH_STATES = Collections.newSetFromMap(new WeakHashMap<>());
/**
* The type Data.
*/
public static class Data { public static class Data {
/**
* Track.
*
* @param instance the instance
*/
public static void track(ILeashData instance) { public static void track(ILeashData instance) {
LEASH_DATA.add(instance); LEASH_DATA.add(instance);
} }
/**
* Untrack.
*
* @param instance the instance
*/
public static void untrack(ILeashData instance) { public static void untrack(ILeashData instance) {
LEASH_DATA.remove(instance); LEASH_DATA.remove(instance);
} }
/**
* For each.
*
* @param consumer the consumer
*/
public static void forEach(Consumer<ILeashData> consumer) { public static void forEach(Consumer<ILeashData> consumer) {
LEASH_DATA.forEach(consumer); LEASH_DATA.forEach(consumer);
} }
} }
/**
* The type State.
*/
public static class State { public static class State {
/**
* Track.
*
* @param instance the instance
*/
public static void track(ILeashState instance) { public static void track(ILeashState instance) {
LEASH_STATES.add(instance); LEASH_STATES.add(instance);
} }
/**
* Untrack.
*
* @param instance the instance
*/
public static void untrack(ILeashState instance) { public static void untrack(ILeashState instance) {
LEASH_STATES.remove(instance); LEASH_STATES.remove(instance);
} }
/**
* For each.
*
* @param consumer the consumer
*/
public static void forEach(Consumer<ILeashState> consumer) { public static void forEach(Consumer<ILeashState> consumer) {
LEASH_STATES.forEach(consumer); LEASH_STATES.forEach(consumer);
} }

View File

@ -36,31 +36,67 @@ public class EternalPotatoFacade {
private static PotatoSavedData savedData; private static PotatoSavedData savedData;
// 全局监听器 // 全局监听器
private static final List<IEternalPotatoChangeListener> listeners = new CopyOnWriteArrayList<>(); private static final List<IEternalPotatoChangeListener> listeners = new CopyOnWriteArrayList<>();
/**
* Add listener.
*
* @param listener the listener
*/
public static void addListener(IEternalPotatoChangeListener listener) { public static void addListener(IEternalPotatoChangeListener listener) {
listeners.add(listener); listeners.add(listener);
} }
/**
* Remove listener.
*
* @param listener the listener
*/
public static void removeListener(IEternalPotatoChangeListener listener) { public static void removeListener(IEternalPotatoChangeListener listener) {
listeners.remove(listener); listeners.remove(listener);
} }
// 内部方法用于通知变化 /**
* Notify change.
*
* @param uuid the uuid
* @param potato the potato
*/
// 内部方法用于通知变化
static void notifyChange(UUID uuid, IEternalPotato potato) { static void notifyChange(UUID uuid, IEternalPotato potato) {
listeners.forEach(l -> l.onPotatoChanged(uuid, potato)); listeners.forEach(l -> l.onPotatoChanged(uuid, potato));
} }
/**
* Gets manager.
*
* @return the manager
*/
public static IEternalPotatoManager getManager() { public static IEternalPotatoManager getManager() {
return manager; return manager;
} }
/**
* Gets saved data.
*
* @return the saved data
*/
public static PotatoSavedData getSavedData() { public static PotatoSavedData getSavedData() {
return savedData; return savedData;
} }
/**
* Init saved data.
*
* @param serverLevel the server level
*/
public static void initSavedData(ServerLevel serverLevel) { public static void initSavedData(ServerLevel serverLevel) {
savedData = PotatoSavedData.create(serverLevel); savedData = PotatoSavedData.create(serverLevel);
} }
/** /**
* 初始化进入世界时调用 * 初始化进入世界时调用
* @param mode 当前运行模式 *
* @param mode 当前运行模式
* @param isServer 是否在服务端 * @param isServer 是否在服务端
*/ */
public static void init(PotatoMode mode, boolean isServer) { public static void init(PotatoMode mode, boolean isServer) {
@ -73,6 +109,12 @@ public class EternalPotatoFacade {
} }
} }
/**
* Gets or create.
*
* @param uuid the uuid
* @return the or create
*/
public static IEternalPotato getOrCreate(UUID uuid) { public static IEternalPotato getOrCreate(UUID uuid) {
if (manager == null) throw new IllegalStateException("EternalPotatoFacade not initialized!"); if (manager == null) throw new IllegalStateException("EternalPotatoFacade not initialized!");
IEternalPotato potato = manager.getOrCreate(uuid); IEternalPotato potato = manager.getOrCreate(uuid);
@ -86,6 +128,11 @@ public class EternalPotatoFacade {
return potato; return potato;
} }
/**
* Remove.
*
* @param uuid the uuid
*/
public static void remove(UUID uuid) { public static void remove(UUID uuid) {
if (manager != null) manager.remove(uuid); if (manager != null) manager.remove(uuid);
@ -98,10 +145,18 @@ public class EternalPotatoFacade {
} }
} }
/**
* Clear.
*/
public static void clear() { public static void clear() {
if (manager != null) manager.clear(); if (manager != null) manager.clear();
} }
/**
* Is server boolean.
*
* @return the boolean
*/
public static boolean isServer() { public static boolean isServer() {
return (manager instanceof SyncedEternalPotatoManager synced) && synced.isServer(); return (manager instanceof SyncedEternalPotatoManager synced) && synced.isServer();
} }

View File

@ -19,6 +19,15 @@ import top.r3944realms.superleadrope.content.capability.inter.IEternalPotato;
import java.util.UUID; import java.util.UUID;
/**
* The interface Eternal potato change listener.
*/
public interface IEternalPotatoChangeListener { public interface IEternalPotatoChangeListener {
/**
* On potato changed.
*
* @param uuid the uuid
* @param potato the potato
*/
void onPotatoChanged(UUID uuid, IEternalPotato potato); void onPotatoChanged(UUID uuid, IEternalPotato potato);
} }

View File

@ -20,12 +20,41 @@ import top.r3944realms.superleadrope.content.capability.inter.IEternalPotato;
import java.util.UUID; import java.util.UUID;
/**
* The interface Eternal potato manager.
*/
public interface IEternalPotatoManager { public interface IEternalPotatoManager {
/**
* Gets or create.
*
* @param uuid the uuid
* @return the or create
*/
IEternalPotato getOrCreate(UUID uuid); IEternalPotato getOrCreate(UUID uuid);
/**
* Remove.
*
* @param uuid the uuid
*/
void remove(UUID uuid); void remove(UUID uuid);
/**
* Clear.
*/
void clear(); void clear();
/**
* Save all compound tag.
*
* @return the compound tag
*/
CompoundTag saveAll(); CompoundTag saveAll();
/**
* Load all.
*
* @param tag the tag
*/
void loadAll(CompoundTag tag); void loadAll(CompoundTag tag);
} }

View File

@ -20,7 +20,13 @@ import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.saveddata.SavedData; import net.minecraft.world.level.saveddata.SavedData;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/**
* The type Potato saved data.
*/
public class PotatoSavedData extends SavedData { public class PotatoSavedData extends SavedData {
/**
* The constant DATA_NAME.
*/
public static final String DATA_NAME = "eternal_potato"; public static final String DATA_NAME = "eternal_potato";
@ -31,6 +37,12 @@ public class PotatoSavedData extends SavedData {
return tag; return tag;
} }
/**
* Load potato saved data.
*
* @param tag the tag
* @return the potato saved data
*/
public static PotatoSavedData load(CompoundTag tag) { public static PotatoSavedData load(CompoundTag tag) {
IEternalPotatoManager manager = EternalPotatoFacade.getManager(); IEternalPotatoManager manager = EternalPotatoFacade.getManager();
PotatoSavedData data = new PotatoSavedData(); PotatoSavedData data = new PotatoSavedData();
@ -40,7 +52,13 @@ public class PotatoSavedData extends SavedData {
return data; return data;
} }
// 工厂方法Forge 推荐写法 /**
* Create potato saved data.
*
* @param level the level
* @return the potato saved data
*/
// 工厂方法Forge 推荐写法
public static PotatoSavedData create(ServerLevel level) { public static PotatoSavedData create(ServerLevel level) {
return level.getDataStorage().computeIfAbsent( return level.getDataStorage().computeIfAbsent(
PotatoSavedData::load, PotatoSavedData::load,

View File

@ -34,6 +34,12 @@ import java.util.concurrent.ConcurrentHashMap;
class SyncedEternalPotatoManager implements IEternalPotatoManager { class SyncedEternalPotatoManager implements IEternalPotatoManager {
private final Map<UUID, EternalPotatoImpl> GLOBAL_DATA = new ConcurrentHashMap<>(); private final Map<UUID, EternalPotatoImpl> GLOBAL_DATA = new ConcurrentHashMap<>();
private final boolean isServer; private final boolean isServer;
/**
* Instantiates a new Synced eternal potato manager.
*
* @param isServer the is server
*/
public SyncedEternalPotatoManager(boolean isServer) { public SyncedEternalPotatoManager(boolean isServer) {
this.isServer = isServer; this.isServer = isServer;
} }
@ -83,6 +89,11 @@ class SyncedEternalPotatoManager implements IEternalPotatoManager {
} }
} }
/**
* Is server boolean.
*
* @return the boolean
*/
public boolean isServer() { public boolean isServer() {
return isServer; return isServer;
} }

View File

@ -30,6 +30,9 @@ import java.util.Map;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
/**
* The type Daily punishment handler.
*/
public class DailyPunishmentHandler { public class DailyPunishmentHandler {
private static long lastProcessedDay = -1; private static long lastProcessedDay = -1;
@ -41,6 +44,9 @@ public class DailyPunishmentHandler {
private static final Map<UUID, Integer> countdownMap = new ConcurrentHashMap<>(); private static final Map<UUID, Integer> countdownMap = new ConcurrentHashMap<>();
/**
* On server tick.
*/
public static void onServerTick() { public static void onServerTick() {
var server = ServerLifecycleHooks.getCurrentServer(); var server = ServerLifecycleHooks.getCurrentServer();

View File

@ -42,8 +42,11 @@ public interface IObligationCompletion {
* @param stack 操作的物品 * @param stack 操作的物品
*/ */
void onCompleted(ServerPlayer player, ItemStack stack); void onCompleted(ServerPlayer player, ItemStack stack);
/** /**
* 获取注册 ID * 获取注册 ID
*
* @return the id
*/ */
default String getId() { default String getId() {
for (Map.Entry<String, IObligationCompletion> entry : SLPObligationCompletionRegistry.getAll().entrySet()) { for (Map.Entry<String, IObligationCompletion> entry : SLPObligationCompletionRegistry.getAll().entrySet()) {
@ -51,15 +54,28 @@ public interface IObligationCompletion {
} }
return "none"; return "none";
} }
// --- 网络序列化 ---
/**
* To network.
*
* @param buf the buf
*/
// --- 网络序列化 ---
default void toNetwork(FriendlyByteBuf buf) { default void toNetwork(FriendlyByteBuf buf) {
buf.writeUtf(this.getId()); buf.writeUtf(this.getId());
} }
/**
* From network obligation completion.
*
* @param buf the buf
* @return the obligation completion
*/
static IObligationCompletion fromNetwork(FriendlyByteBuf buf) { static IObligationCompletion fromNetwork(FriendlyByteBuf buf) {
String id = buf.readUtf(); String id = buf.readUtf();
return SLPObligationCompletionRegistry.byId(id); // 如果没找到返回 NONE return SLPObligationCompletionRegistry.byId(id); // 如果没找到返回 NONE
} }
/** /**
* 一个便捷的静态空实现默认永不完成 * 一个便捷的静态空实现默认永不完成
*/ */

View File

@ -33,33 +33,67 @@ import org.jetbrains.annotations.Nullable;
public record PunishmentDefinition(PunishmentDefinition.Type type, float strength, public record PunishmentDefinition(PunishmentDefinition.Type type, float strength,
boolean affectOthers) { boolean affectOthers) {
/**
* The constant DEFAULT.
*/
public static final PunishmentDefinition DEFAULT = new PunishmentDefinition(Type.LIGHTNING, 0, false); public static final PunishmentDefinition DEFAULT = new PunishmentDefinition(Type.LIGHTNING, 0, false);
/**
* The enum Type.
*/
public enum Type { public enum Type {
/**
* Lightning type.
*/
LIGHTNING, // 雷劈 LIGHTNING, // 雷劈
/**
* Explosion type.
*/
EXPLOSION, // 爆炸 EXPLOSION, // 爆炸
/**
* Effect type.
*/
EFFECT // 给予负面效果 EFFECT // 给予负面效果
} }
/** 序列化到网络 */
/**
* 序列化到网络 @param buf the buf
*/
public void toNetwork(FriendlyByteBuf buf) { public void toNetwork(FriendlyByteBuf buf) {
buf.writeEnum(this.type); buf.writeEnum(this.type);
buf.writeFloat(this.strength); buf.writeFloat(this.strength);
buf.writeBoolean(this.affectOthers); buf.writeBoolean(this.affectOthers);
} }
/** 从网络反序列化 */ /**
* 从网络反序列化 @param buf the buf
*
* @return the punishment definition
*/
public static PunishmentDefinition fromNetwork(FriendlyByteBuf buf) { public static PunishmentDefinition fromNetwork(FriendlyByteBuf buf) {
Type type = buf.readEnum(Type.class); Type type = buf.readEnum(Type.class);
float strength = buf.readFloat(); float strength = buf.readFloat();
boolean affectOthers = buf.readBoolean(); boolean affectOthers = buf.readBoolean();
return new PunishmentDefinition(type, strength, affectOthers); return new PunishmentDefinition(type, strength, affectOthers);
} }
/** /**
* 执行惩罚 * 执行惩罚
*
* @param target the target
* @param cause the cause
*/ */
public void execute(ServerPlayer target, DamageSource cause) { public void execute(ServerPlayer target, DamageSource cause) {
execute(target, cause, null); execute(target, cause, null);
} }
/**
* Execute.
*
* @param target the target
* @param cause the cause
* @param actionMessage the action message
*/
public void execute(ServerPlayer target, DamageSource cause,@Nullable Component actionMessage) { public void execute(ServerPlayer target, DamageSource cause,@Nullable Component actionMessage) {
ServerLevel level = (ServerLevel) target.level(); ServerLevel level = (ServerLevel) target.level();
switch (type) { switch (type) {

View File

@ -24,9 +24,18 @@ import net.minecraftforge.registries.RegistryObject;
import top.r3944realms.superleadrope.SuperLeadRope; import top.r3944realms.superleadrope.SuperLeadRope;
import top.r3944realms.superleadrope.content.entity.SuperLeashKnotEntity; import top.r3944realms.superleadrope.content.entity.SuperLeashKnotEntity;
/**
* The type Slp entity types.
*/
public class SLPEntityTypes { public class SLPEntityTypes {
/**
* The Entity types.
*/
public static DeferredRegister<EntityType<?>> ENTITY_TYPES = public static DeferredRegister<EntityType<?>> ENTITY_TYPES =
DeferredRegister.create(ForgeRegistries.ENTITY_TYPES, SuperLeadRope.MOD_ID); DeferredRegister.create(ForgeRegistries.ENTITY_TYPES, SuperLeadRope.MOD_ID);
/**
* The Super lead knot.
*/
public static RegistryObject<EntityType<SuperLeashKnotEntity>> SUPER_LEAD_KNOT = ENTITY_TYPES.register( public static RegistryObject<EntityType<SuperLeashKnotEntity>> SUPER_LEAD_KNOT = ENTITY_TYPES.register(
"super_lead_knot", "super_lead_knot",
() -> EntityType.Builder.<SuperLeashKnotEntity>of(SuperLeashKnotEntity::new, MobCategory.MISC) () -> EntityType.Builder.<SuperLeashKnotEntity>of(SuperLeashKnotEntity::new, MobCategory.MISC)
@ -36,9 +45,22 @@ public class SLPEntityTypes {
.updateInterval(Integer.MAX_VALUE) .updateInterval(Integer.MAX_VALUE)
.build("super_lead_knot") .build("super_lead_knot")
); );
/**
* Gets entity name key.
*
* @param entityName the entity name
* @return the entity name key
*/
public static String getEntityNameKey(String entityName) { public static String getEntityNameKey(String entityName) {
return "entity." + SuperLeadRope.MOD_ID + "." + entityName; return "entity." + SuperLeadRope.MOD_ID + "." + entityName;
} }
/**
* Register.
*
* @param bus the bus
*/
public static void register(IEventBus bus) { public static void register(IEventBus bus) {
ENTITY_TYPES.register(bus); ENTITY_TYPES.register(bus);
} }

View File

@ -26,14 +26,44 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
/**
* The enum Slp gamerule registry.
*/
public enum SLPGameruleRegistry { public enum SLPGameruleRegistry {
/**
* Instance slp gamerule registry.
*/
INSTANCE; INSTANCE;
/**
* The constant gamerules.
*/
public static final Map<String, GameRules.Key<?>> gamerules = new HashMap<>();; public static final Map<String, GameRules.Key<?>> gamerules = new HashMap<>();;
/**
* The constant gameruleDataTypes.
*/
public static final Map<String, RuleDataType> gameruleDataTypes = new HashMap<>(); public static final Map<String, RuleDataType> gameruleDataTypes = new HashMap<>();
/**
* The enum Rule data type.
*/
public enum RuleDataType { public enum RuleDataType {
/**
* Boolean rule data type.
*/
BOOLEAN, BOOLEAN,
/**
* Integer rule data type.
*/
INTEGER, INTEGER,
} }
/**
* Gets gamerule bool value.
*
* @param level the level
* @param gameruleName the gamerule name
* @return the gamerule bool value
*/
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static boolean getGameruleBoolValue(Level level, String gameruleName) { public static boolean getGameruleBoolValue(Level level, String gameruleName) {
@ -45,6 +75,14 @@ public enum SLPGameruleRegistry {
} }
return level.getGameRules().getBoolean((GameRules.Key<GameRules.BooleanValue>) gamerules.get(gameruleName)); return level.getGameRules().getBoolean((GameRules.Key<GameRules.BooleanValue>) gamerules.get(gameruleName));
} }
/**
* Gets gamerule int value.
*
* @param level the level
* @param gameruleName the gamerule name
* @return the gamerule int value
*/
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static Integer getGameruleIntValue(Level level, String gameruleName) { public static Integer getGameruleIntValue(Level level, String gameruleName) {
if (level.isClientSide && SLPGamerules.gameruleIntegerValuesClient.containsKey(gameruleName)) { if (level.isClientSide && SLPGamerules.gameruleIntegerValuesClient.containsKey(gameruleName)) {
@ -56,20 +94,57 @@ public enum SLPGameruleRegistry {
return level.getGameRules().getInt((GameRules.Key<GameRules.IntegerValue>)gamerules.get(gameruleName)); return level.getGameRules().getInt((GameRules.Key<GameRules.IntegerValue>)gamerules.get(gameruleName));
} }
/**
* Register gamerule.
*
* @param gameruleName the gamerule name
* @param category the category
* @param pDefault the p default
*/
public void registerGamerule(String gameruleName, GameRules.Category category, boolean pDefault) { public void registerGamerule(String gameruleName, GameRules.Category category, boolean pDefault) {
registerGamerule(gameruleName, category, pDefault, (s,i)->{});//最后一个仅占位无用 registerGamerule(gameruleName, category, pDefault, (s,i)->{});//最后一个仅占位无用
} }
/**
* Register gamerule.
*
* @param gameruleName the gamerule name
* @param category the category
* @param pDefault the p default
* @param pChangeListener the p change listener
*/
public void registerGamerule(String gameruleName, GameRules.Category category, boolean pDefault, BiConsumer<MinecraftServer, GameRules.BooleanValue> pChangeListener) { public void registerGamerule(String gameruleName, GameRules.Category category, boolean pDefault, BiConsumer<MinecraftServer, GameRules.BooleanValue> pChangeListener) {
gamerules.put(gameruleName, GameRules.register(gameruleName, category, GameRules.BooleanValue.create(pDefault, pChangeListener))); gamerules.put(gameruleName, GameRules.register(gameruleName, category, GameRules.BooleanValue.create(pDefault, pChangeListener)));
gameruleDataTypes.put(gameruleName, RuleDataType.BOOLEAN); gameruleDataTypes.put(gameruleName, RuleDataType.BOOLEAN);
} }
/**
* Register gamerule.
*
* @param gameruleName the gamerule name
* @param category the category
* @param pDefault the p default
*/
public void registerGamerule(String gameruleName, GameRules.Category category, int pDefault) { public void registerGamerule(String gameruleName, GameRules.Category category, int pDefault) {
registerGamerule(gameruleName, category, pDefault, (s, i)->{});//最后一个仅占位无用 registerGamerule(gameruleName, category, pDefault, (s, i)->{});//最后一个仅占位无用
} }
/**
* Register gamerule.
*
* @param gameruleName the gamerule name
* @param category the category
* @param pDefault the p default
* @param pChangeListener the p change listener
*/
public void registerGamerule(String gameruleName, GameRules.Category category, int pDefault, BiConsumer<MinecraftServer, GameRules.IntegerValue> pChangeListener) { public void registerGamerule(String gameruleName, GameRules.Category category, int pDefault, BiConsumer<MinecraftServer, GameRules.IntegerValue> pChangeListener) {
gamerules.put(gameruleName, GameRules.register(gameruleName, category, GameRules.IntegerValue.create(pDefault, pChangeListener))); gamerules.put(gameruleName, GameRules.register(gameruleName, category, GameRules.IntegerValue.create(pDefault, pChangeListener)));
gameruleDataTypes.put(gameruleName, RuleDataType.INTEGER); gameruleDataTypes.put(gameruleName, RuleDataType.INTEGER);
} }
/**
* Register.
*/
public static void register() { public static void register() {
TeleportWithLeashedEntities.register(); TeleportWithLeashedEntities.register();
CreateSuperLeashKnotEntityIfAbsent.register(); CreateSuperLeashKnotEntityIfAbsent.register();

View File

@ -24,12 +24,24 @@ import top.r3944realms.superleadrope.SuperLeadRope;
import top.r3944realms.superleadrope.content.item.EternalPotatoItem; import top.r3944realms.superleadrope.content.item.EternalPotatoItem;
import top.r3944realms.superleadrope.content.item.SuperLeadRopeItem; import top.r3944realms.superleadrope.content.item.SuperLeadRopeItem;
/**
* The type Slp items.
*/
public class SLPItems { public class SLPItems {
/**
* The constant ITEMS.
*/
public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, SuperLeadRope.MOD_ID); public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, SuperLeadRope.MOD_ID);
/**
* The constant SUPER_LEAD_ROPE.
*/
public static final RegistryObject<Item> SUPER_LEAD_ROPE = ITEMS.register( public static final RegistryObject<Item> SUPER_LEAD_ROPE = ITEMS.register(
"super_lead_rope", "super_lead_rope",
() -> new SuperLeadRopeItem(new Item.Properties()) () -> new SuperLeadRopeItem(new Item.Properties())
); );
/**
* The constant ETERNAL_POTATO.
*/
public static final RegistryObject<Item> ETERNAL_POTATO = public static final RegistryObject<Item> ETERNAL_POTATO =
ITEMS.register("eternal_potato", ITEMS.register("eternal_potato",
() -> new EternalPotatoItem( () -> new EternalPotatoItem(
@ -37,6 +49,12 @@ public class SLPItems {
.stacksTo(1) // 只能有一颗 .stacksTo(1) // 只能有一颗
.fireResistant() // 防火 .fireResistant() // 防火
)); ));
/**
* Register.
*
* @param bus the bus
*/
public static void register(IEventBus bus) { public static void register(IEventBus bus) {
ITEMS.register(bus); ITEMS.register(bus);
} }

View File

@ -31,7 +31,8 @@ public class SLPObligationCompletionRegistry {
/** /**
* 注册一个 IObligationCompletion 实例 * 注册一个 IObligationCompletion 实例
* @param id 唯一 ID *
* @param id 唯一 ID
* @param completion 实例 * @param completion 实例
*/ */
public static void register(String id, IObligationCompletion completion) { public static void register(String id, IObligationCompletion completion) {
@ -42,8 +43,9 @@ public class SLPObligationCompletionRegistry {
/** /**
* 根据 ID 获取 IObligationCompletion 实例 * 根据 ID 获取 IObligationCompletion 实例
*
* @param id ID * @param id ID
* @return 实例如果未注册则返回 NONE * @return 实例 如果未注册则返回 NONE
*/ */
public static IObligationCompletion byId(String id) { public static IObligationCompletion byId(String id) {
return REGISTRY.getOrDefault(id, IObligationCompletion.NONE); return REGISTRY.getOrDefault(id, IObligationCompletion.NONE);
@ -51,6 +53,8 @@ public class SLPObligationCompletionRegistry {
/** /**
* 获取只读注册表用于调试或枚举 * 获取只读注册表用于调试或枚举
*
* @return the all
*/ */
public static Map<String, IObligationCompletion> getAll() { public static Map<String, IObligationCompletion> getAll() {
return Collections.unmodifiableMap(REGISTRY); return Collections.unmodifiableMap(REGISTRY);

View File

@ -23,21 +23,58 @@ import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject; import net.minecraftforge.registries.RegistryObject;
import top.r3944realms.superleadrope.SuperLeadRope; import top.r3944realms.superleadrope.SuperLeadRope;
/**
* The type Slp sound events.
*/
public class SLPSoundEvents { public class SLPSoundEvents {
/**
* The constant SOUND_EVENTS.
*/
public static final DeferredRegister<SoundEvent> SOUND_EVENTS = DeferredRegister.create(ForgeRegistries.SOUND_EVENTS, SuperLeadRope.MOD_ID); public static final DeferredRegister<SoundEvent> SOUND_EVENTS = DeferredRegister.create(ForgeRegistries.SOUND_EVENTS, SuperLeadRope.MOD_ID);
/**
* The constant RL_LEAD_UNTIED.
*/
public static final ResourceLocation RL_LEAD_UNTIED = new ResourceLocation(SuperLeadRope.MOD_ID,"item/superlead/lead_untied"); public static final ResourceLocation RL_LEAD_UNTIED = new ResourceLocation(SuperLeadRope.MOD_ID,"item/superlead/lead_untied");
/**
* The constant RL_LEAD_TIED.
*/
public static final ResourceLocation RL_LEAD_TIED = new ResourceLocation(SuperLeadRope.MOD_ID,"item/superlead/lead_tied"); public static final ResourceLocation RL_LEAD_TIED = new ResourceLocation(SuperLeadRope.MOD_ID,"item/superlead/lead_tied");
/**
* The constant RL_LEAD_BREAK.
*/
public static final ResourceLocation RL_LEAD_BREAK = new ResourceLocation(SuperLeadRope.MOD_ID,"item/superlead/lead_break"); public static final ResourceLocation RL_LEAD_BREAK = new ResourceLocation(SuperLeadRope.MOD_ID,"item/superlead/lead_break");
/**
* The constant LEAD_UNTIED.
*/
public static final RegistryObject<SoundEvent> LEAD_UNTIED = registerSound("lead_untied"); public static final RegistryObject<SoundEvent> LEAD_UNTIED = registerSound("lead_untied");
/**
* The constant LEAD_TIED.
*/
public static final RegistryObject<SoundEvent> LEAD_TIED = registerSound("lead_tied"); public static final RegistryObject<SoundEvent> LEAD_TIED = registerSound("lead_tied");
/**
* The constant LEAD_BREAK.
*/
public static final RegistryObject<SoundEvent> LEAD_BREAK = registerSound("lead_break"); public static final RegistryObject<SoundEvent> LEAD_BREAK = registerSound("lead_break");
private static RegistryObject<SoundEvent> registerSound(String name) { private static RegistryObject<SoundEvent> registerSound(String name) {
ResourceLocation location = new ResourceLocation(SuperLeadRope.MOD_ID, name); ResourceLocation location = new ResourceLocation(SuperLeadRope.MOD_ID, name);
return SOUND_EVENTS.register(name, () -> SoundEvent.createVariableRangeEvent(location)); return SOUND_EVENTS.register(name, () -> SoundEvent.createVariableRangeEvent(location));
} }
/**
* Register.
*
* @param bus the bus
*/
public static void register(IEventBus bus) { public static void register(IEventBus bus) {
SOUND_EVENTS.register(bus); SOUND_EVENTS.register(bus);
} }
/**
* Gets sub title translate key.
*
* @param name the name
* @return the sub title translate key
*/
public static String getSubTitleTranslateKey(String name) { public static String getSubTitleTranslateKey(String name) {
return "sound." + SuperLeadRope.MOD_ID + ".subtitle." + name; return "sound." + SuperLeadRope.MOD_ID + ".subtitle." + name;
} }

View File

@ -17,8 +17,23 @@ package top.r3944realms.superleadrope.core.util;
import java.util.Objects; import java.util.Objects;
/**
* The type Immutable pair.
*
* @param <F> the type parameter
* @param <S> the type parameter
*/
public record ImmutablePair<F, S>(F first, S second) { public record ImmutablePair<F, S>(F first, S second) {
/**
* Of immutable pair.
*
* @param <F> the type parameter
* @param <S> the type parameter
* @param first the first
* @param second the second
* @return the immutable pair
*/
public static <F, S> ImmutablePair<F, S> of(F first, S second) { public static <F, S> ImmutablePair<F, S> of(F first, S second) {
return new ImmutablePair<>(first, second); return new ImmutablePair<>(first, second);
} }

View File

@ -15,6 +15,9 @@
package top.r3944realms.superleadrope.core.util; package top.r3944realms.superleadrope.core.util;
/**
* The enum Potato mode.
*/
public enum PotatoMode { public enum PotatoMode {
/** /**
* 单人 or 局域网主机 * 单人 or 局域网主机
@ -28,6 +31,12 @@ public enum PotatoMode {
* 远程连接的客户端 * 远程连接的客户端
*/ */
REMOTE_CLIENT; REMOTE_CLIENT;
/**
* Is synced boolean.
*
* @return the boolean
*/
public boolean isSynced() { public boolean isSynced() {
// Synced 模式DEDICATED 服务端 + REMOTE_CLIENT 客户端 // Synced 模式DEDICATED 服务端 + REMOTE_CLIENT 客户端
return this == DEDICATED || this == REMOTE_CLIENT; return this == DEDICATED || this == REMOTE_CLIENT;

View File

@ -20,8 +20,16 @@ import net.minecraft.server.MinecraftServer;
import net.minecraftforge.fml.loading.FMLEnvironment; import net.minecraftforge.fml.loading.FMLEnvironment;
import net.minecraftforge.server.ServerLifecycleHooks; import net.minecraftforge.server.ServerLifecycleHooks;
/**
* The type Potato mode helper.
*/
public class PotatoModeHelper { public class PotatoModeHelper {
/**
* Gets current mode.
*
* @return the current mode
*/
public static PotatoMode getCurrentMode() { public static PotatoMode getCurrentMode() {
if (FMLEnvironment.dist.isClient()) { if (FMLEnvironment.dist.isClient()) {
Minecraft mc = Minecraft.getInstance(); Minecraft mc = Minecraft.getInstance();

View File

@ -29,9 +29,21 @@ import top.r3944realms.superleadrope.util.lang.LanguageEnum;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
/**
* The type Slp data gen event.
*/
@Mod.EventBusSubscriber(modid = SuperLeadRope.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD) @Mod.EventBusSubscriber(modid = SuperLeadRope.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD)
public class SLPDataGenEvent { public class SLPDataGenEvent {
/**
* The Logger.
*/
static Logger logger = LoggerFactory.getLogger(SLPDataGenEvent.class); static Logger logger = LoggerFactory.getLogger(SLPDataGenEvent.class);
/**
* Gather data.
*
* @param event the event
*/
@SubscribeEvent @SubscribeEvent
public static void gatherData(GatherDataEvent event) { public static void gatherData(GatherDataEvent event) {
logger.info("GatherDataEvent thread: {}", Thread.currentThread().getName()); logger.info("GatherDataEvent thread: {}", Thread.currentThread().getName());

View File

@ -18,6 +18,9 @@ import top.r3944realms.superleadrope.SuperLeadRope;
import javax.annotation.Nullable; import javax.annotation.Nullable;
/**
* The enum Slp advancement key.
*/
public enum SLPAdvancementKey { public enum SLPAdvancementKey {
; ;
private final String Name; private final String Name;
@ -28,16 +31,38 @@ public enum SLPAdvancementKey {
this.Parent = parent; this.Parent = parent;
} }
/**
* Gets parent.
*
* @return the parent
*/
public @Nullable SLPAdvancementKey getParent() { public @Nullable SLPAdvancementKey getParent() {
return Parent; return Parent;
} }
/**
* Gets name key.
*
* @return the name key
*/
public String getNameKey() { public String getNameKey() {
return "advancement." + SuperLeadRope.MOD_ID + "." + Name; return "advancement." + SuperLeadRope.MOD_ID + "." + Name;
} }
/**
* Gets desc key.
*
* @return the desc key
*/
public String getDescKey() { public String getDescKey() {
return this.getNameKey() + ".desc"; return this.getNameKey() + ".desc";
} }
/**
* Gets name with name space.
*
* @return the name with name space
*/
public String getNameWithNameSpace() { public String getNameWithNameSpace() {
return SuperLeadRope.MOD_ID + ":" + this.Name; return SuperLeadRope.MOD_ID + ":" + this.Name;
} }

View File

@ -33,17 +33,29 @@ import javax.annotation.Nullable;
import java.util.function.Supplier; import java.util.function.Supplier;
/**
* The enum Slp lang key value.
*/
public enum SLPLangKeyValue { public enum SLPLangKeyValue {
/**
* The Item super lead rope.
*/
ITEM_SUPER_LEAD_ROPE( ITEM_SUPER_LEAD_ROPE(
SLPItems.SUPER_LEAD_ROPE, ModPartEnum.ITEM, SLPItems.SUPER_LEAD_ROPE, ModPartEnum.ITEM,
"Super Lead Rope", "超级拴绳", "超級拴繩","神駒羈縻索" "Super Lead Rope", "超级拴绳", "超級拴繩","神駒羈縻索"
), ),
/**
* The Item eternal potato.
*/
ITEM_ETERNAL_POTATO( ITEM_ETERNAL_POTATO(
SLPItems.ETERNAL_POTATO, ModPartEnum.ITEM, SLPItems.ETERNAL_POTATO, ModPartEnum.ITEM,
"Eternal Potato", "永恒土豆", "永恆馬鈴薯", "不滅薯", true "Eternal Potato", "永恒土豆", "永恆馬鈴薯", "不滅薯", true
), ),
/**
* The Ep tooltip title.
*/
EP_TOOLTIP_TITLE( EP_TOOLTIP_TITLE(
EternalPotatoItem.getDescKey("title"), ModPartEnum.DESCRIPTION, EternalPotatoItem.getDescKey("title"), ModPartEnum.DESCRIPTION,
"§6Mythical Item §7- §6Eternal Potato", "§6Mythical Item §7- §6Eternal Potato",
@ -52,6 +64,9 @@ public enum SLPLangKeyValue {
"§6永恒土豆 §7- §6传奇之物" "§6永恒土豆 §7- §6传奇之物"
), ),
/**
* The Ep desc tooltip.
*/
EP_DESC_TOOLTIP( EP_DESC_TOOLTIP(
EternalPotatoItem.getDescKey("desc"), ModPartEnum.DESCRIPTION, EternalPotatoItem.getDescKey("desc"), ModPartEnum.DESCRIPTION,
"§7Symbol of server-wide contract, cannot be discarded", "§7Symbol of server-wide contract, cannot be discarded",
@ -60,6 +75,9 @@ public enum SLPLangKeyValue {
"§7象征全服契约绝不可弃" "§7象征全服契约绝不可弃"
), ),
/**
* The Ep bind owner.
*/
EP_BIND_OWNER( EP_BIND_OWNER(
EternalPotatoItem.getDescKey("bind_owner"), ModPartEnum.DESCRIPTION, EternalPotatoItem.getDescKey("bind_owner"), ModPartEnum.DESCRIPTION,
"§bBound Owner: §f%s", "§bBound Owner: §f%s",
@ -68,6 +86,9 @@ public enum SLPLangKeyValue {
"§b绑定主人: §f%s" "§b绑定主人: §f%s"
), ),
/**
* Ep unbound slp lang key value.
*/
EP_UNBOUND(EternalPotatoItem.getDescKey("unbound"), ModPartEnum.DESCRIPTION, EP_UNBOUND(EternalPotatoItem.getDescKey("unbound"), ModPartEnum.DESCRIPTION,
"§cUnbound", "§cUnbound",
"§c未绑定主人", "§c未绑定主人",
@ -75,6 +96,9 @@ public enum SLPLangKeyValue {
"§c尚未绑定主人" "§c尚未绑定主人"
), ),
/**
* The Ep obligation tooltip.
*/
EP_OBLIGATION_TOOLTIP( EP_OBLIGATION_TOOLTIP(
EternalPotatoItem.getDescKey("obligation"), ModPartEnum.DESCRIPTION, EternalPotatoItem.getDescKey("obligation"), ModPartEnum.DESCRIPTION,
"§7Daily obligations remaining: §a%d §c(+%d§c overdue)", "§7Daily obligations remaining: §a%d §c(+%d§c overdue)",
@ -83,6 +107,9 @@ public enum SLPLangKeyValue {
"§7今日责务尚余: §a%d §c(+%d §c逾期未尽)" "§7今日责务尚余: §a%d §c(+%d §c逾期未尽)"
), ),
/**
* The Ep punish tooltip.
*/
EP_PUNISH_TOOLTIP( EP_PUNISH_TOOLTIP(
EternalPotatoItem.getDescKey("punish"), ModPartEnum.DESCRIPTION, EternalPotatoItem.getDescKey("punish"), ModPartEnum.DESCRIPTION,
"§cOverdue punishments: §4%d §7(will be applied), grace exceeded: §4%d", "§cOverdue punishments: §4%d §7(will be applied), grace exceeded: §4%d",
@ -91,6 +118,9 @@ public enum SLPLangKeyValue {
"§c逾期责务尚未完成: §4%d §7(將受懲罰),超出寬限數: §4%d" "§c逾期责务尚未完成: §4%d §7(將受懲罰),超出寬限數: §4%d"
), ),
/**
* The Ep obligation info.
*/
EP_OBLIGATION_INFO( EP_OBLIGATION_INFO(
EternalPotatoItem.getMsgKey("obligation_info"), ModPartEnum.MESSAGE, EternalPotatoItem.getMsgKey("obligation_info"), ModPartEnum.MESSAGE,
"§e[Eternal Potato] §fThis is the server-wide shared person, remaining obligations today: §a%d§f.", "§e[Eternal Potato] §fThis is the server-wide shared person, remaining obligations today: §a%d§f.",
@ -99,6 +129,9 @@ public enum SLPLangKeyValue {
"§e[永恒土豆] §f此为全服共享之人今日责务尚余§a%d§f次。" "§e[永恒土豆] §f此为全服共享之人今日责务尚余§a%d§f次。"
), ),
/**
* The Ep potato heal.
*/
EP_POTATO_HEAL( EP_POTATO_HEAL(
EternalPotatoItem.getMsgKey("potato_heal"), ModPartEnum.MESSAGE, EternalPotatoItem.getMsgKey("potato_heal"), ModPartEnum.MESSAGE,
"§aThe power of the Eternal Potato comforts you, it won't disappear.", "§aThe power of the Eternal Potato comforts you, it won't disappear.",
@ -107,6 +140,9 @@ public enum SLPLangKeyValue {
"§a永恒土豆之力慰心永不消逝。" "§a永恒土豆之力慰心永不消逝。"
), ),
/**
* The Ep cannot drop.
*/
EP_CANNOT_DROP( EP_CANNOT_DROP(
EternalPotatoItem.getMsgKey("cannot_drop"), ModPartEnum.MESSAGE, EternalPotatoItem.getMsgKey("cannot_drop"), ModPartEnum.MESSAGE,
"§cThe Eternal Potato cannot be dropped! +%d punishments.", "§cThe Eternal Potato cannot be dropped! +%d punishments.",
@ -115,6 +151,9 @@ public enum SLPLangKeyValue {
"§c永恒土豆不可丟棄懲罰數增加%d" "§c永恒土豆不可丟棄懲罰數增加%d"
), ),
/**
* The Ep bind msg.
*/
EP_BIND_MSG( EP_BIND_MSG(
EternalPotatoItem.getMsgKey("bind_msg"), ModPartEnum.MESSAGE, EternalPotatoItem.getMsgKey("bind_msg"), ModPartEnum.MESSAGE,
"§6Bound to you as the server-wide shared person.", "§6Bound to you as the server-wide shared person.",
@ -124,7 +163,9 @@ public enum SLPLangKeyValue {
), ),
/**
* The Ep obligation done.
*/
EP_OBLIGATION_DONE( EP_OBLIGATION_DONE(
EternalPotatoItem.getMsgKey("obligation_done"), ModPartEnum.MESSAGE, EternalPotatoItem.getMsgKey("obligation_done"), ModPartEnum.MESSAGE,
"§eObligation completed, remaining: §a%d§e", "§eObligation completed, remaining: §a%d§e",
@ -133,6 +174,9 @@ public enum SLPLangKeyValue {
"§e责务完成尚余 §a%d §e次。" "§e责务完成尚余 §a%d §e次。"
), ),
/**
* The Ep obligation full.
*/
EP_OBLIGATION_FULL( EP_OBLIGATION_FULL(
EternalPotatoItem.getMsgKey("obligation_full"), ModPartEnum.MESSAGE, EternalPotatoItem.getMsgKey("obligation_full"), ModPartEnum.MESSAGE,
"§aAll obligations completed today!", "§aAll obligations completed today!",
@ -141,6 +185,9 @@ public enum SLPLangKeyValue {
"§a今日责务尽矣" "§a今日责务尽矣"
), ),
/**
* The Ep punish msg.
*/
EP_PUNISH_MSG( EP_PUNISH_MSG(
EternalPotatoItem.getMsgKey("punish_msg"), ModPartEnum.MESSAGE, EternalPotatoItem.getMsgKey("punish_msg"), ModPartEnum.MESSAGE,
"§cYesterday obligations incomplete, punished!", "§cYesterday obligations incomplete, punished!",
@ -149,6 +196,9 @@ public enum SLPLangKeyValue {
"§c昨日之责未尽受罚矣" "§c昨日之责未尽受罚矣"
), ),
/**
* The Ep obligation countdown.
*/
EP_OBLIGATION_COUNTDOWN(EternalPotatoItem.getMsgKey("obligation_countdown"), ModPartEnum.MESSAGE, EP_OBLIGATION_COUNTDOWN(EternalPotatoItem.getMsgKey("obligation_countdown"), ModPartEnum.MESSAGE,
"Punish Countdown: §a%d §fseconds remaining", "Punish Countdown: §a%d §fseconds remaining",
"惩罚倒计时: §a%d §f秒", "惩罚倒计时: §a%d §f秒",
@ -156,6 +206,9 @@ public enum SLPLangKeyValue {
"受罚倒数§a%d §f瞬" "受罚倒数§a%d §f瞬"
), ),
/**
* The Ep pickup not owner.
*/
EP_PICKUP_NOT_OWNER( EP_PICKUP_NOT_OWNER(
EternalPotatoItem.getMsgKey("pickup_not_owner"), ModPartEnum.MESSAGE, EternalPotatoItem.getMsgKey("pickup_not_owner"), ModPartEnum.MESSAGE,
"§cYou are not the rightful owner and cannot pick this up!", "§cYou are not the rightful owner and cannot pick this up!",
@ -164,6 +217,9 @@ public enum SLPLangKeyValue {
"§c非汝所主勿取" "§c非汝所主勿取"
), ),
/**
* The Ep punish not owner.
*/
EP_PUNISH_NOT_OWNER( EP_PUNISH_NOT_OWNER(
EternalPotatoItem.getMsgKey("punish_not_owner"), ModPartEnum.MESSAGE, EternalPotatoItem.getMsgKey("punish_not_owner"), ModPartEnum.MESSAGE,
"§cYou are not the rightful owner, punished by lightning!", "§cYou are not the rightful owner, punished by lightning!",
@ -171,6 +227,9 @@ public enum SLPLangKeyValue {
"§c非綁定主人使用受到閃電懲罰", "§c非綁定主人使用受到閃電懲罰",
"§c非汝所主雷霆降身" "§c非汝所主雷霆降身"
), ),
/**
* The Ep punish not owner death msg.
*/
EP_PUNISH_NOT_OWNER_DEATH_MSG( EP_PUNISH_NOT_OWNER_DEATH_MSG(
"death.attack.eternal_potato_not_owner", ModPartEnum.MESSAGE, "death.attack.eternal_potato_not_owner", ModPartEnum.MESSAGE,
"§c%1$s was not the rightful owner, struck by lightning!", "§c%1$s was not the rightful owner, struck by lightning!",
@ -178,6 +237,9 @@ public enum SLPLangKeyValue {
"§c%1$s 因使用非自己綁定物品,受到閃電懲罰!", "§c%1$s 因使用非自己綁定物品,受到閃電懲罰!",
"§c%1$s 非汝所主,雷霆降身!" "§c%1$s 非汝所主,雷霆降身!"
), ),
/**
* The Ep punish not compete death msg.
*/
EP_PUNISH_NOT_COMPETE_DEATH_MSG( EP_PUNISH_NOT_COMPETE_DEATH_MSG(
"death.attack.eternal_potato_not_complete", ModPartEnum.MESSAGE, "death.attack.eternal_potato_not_complete", ModPartEnum.MESSAGE,
"§c%1$s was not the rightful owner, struck by lightning!", "§c%1$s was not the rightful owner, struck by lightning!",
@ -185,25 +247,40 @@ public enum SLPLangKeyValue {
"§c%1$s 因使用非自己綁定物品,受到閃電懲罰!", "§c%1$s 因使用非自己綁定物品,受到閃電懲罰!",
"§c%1$s 非汝所主,雷霆降身!" "§c%1$s 非汝所主,雷霆降身!"
), ),
/**
* The Sound subtitle super lead break.
*/
SOUND_SUBTITLE_SUPER_LEAD_BREAK( SOUND_SUBTITLE_SUPER_LEAD_BREAK(
SLPSoundEvents.getSubTitleTranslateKey("lead_break"), ModPartEnum.SOUND, SLPSoundEvents.getSubTitleTranslateKey("lead_break"), ModPartEnum.SOUND,
"Lead Break", "拴绳断裂", "拴繩斷裂", "索絕" "Lead Break", "拴绳断裂", "拴繩斷裂", "索絕"
), ),
/**
* The Sound subtitle super lead tied.
*/
SOUND_SUBTITLE_SUPER_LEAD_TIED( SOUND_SUBTITLE_SUPER_LEAD_TIED(
SLPSoundEvents.getSubTitleTranslateKey("lead_tied"), ModPartEnum.SOUND, SLPSoundEvents.getSubTitleTranslateKey("lead_tied"), ModPartEnum.SOUND,
"Lead Tied", "拴绳系上", "拴繩係上", "繫索" "Lead Tied", "拴绳系上", "拴繩係上", "繫索"
), ),
/**
* The Sound subtitle super lead untied.
*/
SOUND_SUBTITLE_SUPER_LEAD_UNTIED( SOUND_SUBTITLE_SUPER_LEAD_UNTIED(
SLPSoundEvents.getSubTitleTranslateKey("lead_untied"), ModPartEnum.SOUND, SLPSoundEvents.getSubTitleTranslateKey("lead_untied"), ModPartEnum.SOUND,
"Lead Untie", "拴绳解开", "拴繩解開", "解索" "Lead Untie", "拴绳解开", "拴繩解開", "解索"
), ),
/**
* The Entity super lead knot.
*/
ENTITY_SUPER_LEAD_KNOT( ENTITY_SUPER_LEAD_KNOT(
SLPEntityTypes.getEntityNameKey("super_lead_knot"), ModPartEnum.ENTITY, SLPEntityTypes.getEntityNameKey("super_lead_knot"), ModPartEnum.ENTITY,
"Super Lead Knot", "超级拴绳结", "超級拴繩結", "神駒羈縻索結" "Super Lead Knot", "超级拴绳结", "超級拴繩結", "神駒羈縻索結"
), ),
/**
* The Teleport with leashed entities name.
*/
TELEPORT_WITH_LEASHED_ENTITIES_NAME( TELEPORT_WITH_LEASHED_ENTITIES_NAME(
TeleportWithLeashedEntities.NAME_KEY, ModPartEnum.GAME_RULE, TeleportWithLeashedEntities.NAME_KEY, ModPartEnum.GAME_RULE,
"Teleport leashed player with holder", "Teleport leashed player with holder",
@ -211,6 +288,9 @@ public enum SLPLangKeyValue {
"被拴实体随持有者傳送", "被拴实体随持有者傳送",
"繫畜隨持者傳送" "繫畜隨持者傳送"
), ),
/**
* The Create super leash knot entity if absent name.
*/
CREATE_SUPER_LEASH_KNOT_ENTITY_IF_ABSENT_NAME( CREATE_SUPER_LEASH_KNOT_ENTITY_IF_ABSENT_NAME(
CreateSuperLeashKnotEntityIfAbsent.NAME_KEY, ModPartEnum.NAME, CreateSuperLeashKnotEntityIfAbsent.NAME_KEY, ModPartEnum.NAME,
"Create Leash Fence Knot Entity if absent", "Create Leash Fence Knot Entity if absent",
@ -218,6 +298,9 @@ public enum SLPLangKeyValue {
"如果缺失則創建超級拴繩結", "如果缺失則創建超級拴繩結",
"若阙则创超级繫绳结" "若阙则创超级繫绳结"
), ),
/**
* The Create super leash knot entity if absent description.
*/
CREATE_SUPER_LEASH_KNOT_ENTITY_IF_ABSENT_DESCRIPTION( CREATE_SUPER_LEASH_KNOT_ENTITY_IF_ABSENT_DESCRIPTION(
CreateSuperLeashKnotEntityIfAbsent.DESCRIPTION_KEY, ModPartEnum.DESCRIPTION, CreateSuperLeashKnotEntityIfAbsent.DESCRIPTION_KEY, ModPartEnum.DESCRIPTION,
"Create LeashKnot Entity if it's absent on fence or other supported positions", "Create LeashKnot Entity if it's absent on fence or other supported positions",
@ -225,6 +308,9 @@ public enum SLPLangKeyValue {
"如果在柵欄等支持處缺失超級拴繩結,則創建它", "如果在柵欄等支持處缺失超級拴繩結,則創建它",
"若栅等支处阙超级繫绳结,则创之" "若栅等支处阙超级繫绳结,则创之"
), ),
/**
* The Teleport with leashed description.
*/
TELEPORT_WITH_LEASHED_DESCRIPTION( TELEPORT_WITH_LEASHED_DESCRIPTION(
TeleportWithLeashedEntities.DESCRIPTION_KEY, ModPartEnum.DESCRIPTION, TeleportWithLeashedEntities.DESCRIPTION_KEY, ModPartEnum.DESCRIPTION,
"Holder will teleport with their leashed players ", "Holder will teleport with their leashed players ",
@ -232,6 +318,9 @@ public enum SLPLangKeyValue {
"將被拴实体將隨持有者一起傳送", "將被拴实体將隨持有者一起傳送",
"傳送時繫畜隨持者同傳" "傳送時繫畜隨持者同傳"
), ),
/**
* The Message motion adder successful.
*/
MESSAGE_MOTION_ADDER_SUCCESSFUL( MESSAGE_MOTION_ADDER_SUCCESSFUL(
MotionCommand.MOTION_ADDER_SUCCESSFUL, ModPartEnum.COMMAND, MotionCommand.MOTION_ADDER_SUCCESSFUL, ModPartEnum.COMMAND,
"§bAdd Successfully.§a%s§7:§f[§eVec§7:§a(§f%.2f§7,§f%.2f§7,§f%.2f§7)§f]§r", "§bAdd Successfully.§a%s§7:§f[§eVec§7:§a(§f%.2f§7,§f%.2f§7,§f%.2f§7)§f]§r",
@ -239,6 +328,9 @@ public enum SLPLangKeyValue {
"§b添加成功.§a%s§7:§f[§e加速§7:(§a%.2f§7,§a%.2f§7,§a%.2f§7)§f]§r", "§b添加成功.§a%s§7:§f[§e加速§7:(§a%.2f§7,§a%.2f§7,§a%.2f§7)§f]§r",
"§b增益既成.§a%s§7:§f[§e速勢§7:(§a%.2f§7,§a%.2f§7,§a%.2f§7)§f]§r" "§b增益既成.§a%s§7:§f[§e速勢§7:(§a%.2f§7,§a%.2f§7,§a%.2f§7)§f]§r"
), ),
/**
* The Message motion setter successful.
*/
MESSAGE_MOTION_SETTER_SUCCESSFUL( MESSAGE_MOTION_SETTER_SUCCESSFUL(
MotionCommand.MOTION_SETTER_SUCCESSFUL, ModPartEnum.COMMAND, MotionCommand.MOTION_SETTER_SUCCESSFUL, ModPartEnum.COMMAND,
"§bSet Successfully.§a%s§7:§f[§eVec§7:§a(§f%.2f§7,§f%.2f§7,§f%.2f§7)§f]§r", "§bSet Successfully.§a%s§7:§f[§eVec§7:§a(§f%.2f§7,§f%.2f§7,§f%.2f§7)§f]§r",
@ -246,6 +338,9 @@ public enum SLPLangKeyValue {
"§b設置成功.§a%s§7:§f[§e加速§7:(§a%.2f§7,§a%.2f§7,§a%.2f§7)§f]§r", "§b設置成功.§a%s§7:§f[§e加速§7:(§a%.2f§7,§a%.2f§7,§a%.2f§7)§f]§r",
"§b定值既成.§a%s§7:§f[§e速勢§7:(§a%.2f§7,§a%.2f§7,§a%.2f§7)§f]§r" "§b定值既成.§a%s§7:§f[§e速勢§7:(§a%.2f§7,§a%.2f§7,§a%.2f§7)§f]§r"
), ),
/**
* The Message motion multiply successful.
*/
MESSAGE_MOTION_MULTIPLY_SUCCESSFUL( MESSAGE_MOTION_MULTIPLY_SUCCESSFUL(
MotionCommand.MOTION_MULTIPLY_SUCCESSFUL, ModPartEnum.COMMAND, MotionCommand.MOTION_MULTIPLY_SUCCESSFUL, ModPartEnum.COMMAND,
"§bMultiply Successfully.§a%s§7:§f[§eVec§7:§a(§f%.2f§7,§f%.2f§7,§f%.2f§7)§f]§r", "§bMultiply Successfully.§a%s§7:§f[§eVec§7:§a(§f%.2f§7,§f%.2f§7,§f%.2f§7)§f]§r",
@ -253,6 +348,9 @@ public enum SLPLangKeyValue {
"§b倍乘成功.§a%s§7:§f[§e加速§7:(§a%.2f§7,§a%.2f§7,§a%.2f§7)§f]§r", "§b倍乘成功.§a%s§7:§f[§e加速§7:(§a%.2f§7,§a%.2f§7,§a%.2f§7)§f]§r",
"§b倍乘既成.§a%s§7:§f[§e速勢§7:(§a%.2f§7,§a%.2f§7,§a%.2f§7)§f]§r" "§b倍乘既成.§a%s§7:§f[§e速勢§7:(§a%.2f§7,§a%.2f§7,§a%.2f§7)§f]§r"
), ),
/**
* The Message leashdata get title.
*/
MESSAGE_LEASHDATA_GET_TITLE( MESSAGE_LEASHDATA_GET_TITLE(
LeashDataCommand.TITLE, ModPartEnum.COMMAND, LeashDataCommand.TITLE, ModPartEnum.COMMAND,
"=== Leash Data for %s ===", "=== Leash Data for %s ===",
@ -260,6 +358,9 @@ public enum SLPLangKeyValue {
"=== %s 的拴繩數據 ===", "=== %s 的拴繩數據 ===",
"=== %s 之繫繩數據 ===" "=== %s 之繫繩數據 ==="
), ),
/**
* The Message leashdata get total.
*/
MESSAGE_LEASHDATA_GET_TOTAL( MESSAGE_LEASHDATA_GET_TOTAL(
LeashDataCommand.TOTAL, ModPartEnum.COMMAND, LeashDataCommand.TOTAL, ModPartEnum.COMMAND,
"Total leashes: %d", "Total leashes: %d",
@ -267,6 +368,9 @@ public enum SLPLangKeyValue {
"總拴繩數: %d", "總拴繩數: %d",
"繫繩總數: %d" "繫繩總數: %d"
), ),
/**
* Message leashdata get block slp lang key value.
*/
MESSAGE_LEASHDATA_GET_BLOCK( MESSAGE_LEASHDATA_GET_BLOCK(
LeashDataCommand.BLOCK, ModPartEnum.COMMAND, LeashDataCommand.BLOCK, ModPartEnum.COMMAND,
"§7Block: §e%s", "§7Block: §e%s",
@ -274,6 +378,9 @@ public enum SLPLangKeyValue {
"§7方塊: §e%s", "§7方塊: §e%s",
"§7磚石: §e%s" "§7磚石: §e%s"
), ),
/**
* Message leashdata get uuid slp lang key value.
*/
MESSAGE_LEASHDATA_GET_UUID( MESSAGE_LEASHDATA_GET_UUID(
LeashDataCommand.UUID, ModPartEnum.COMMAND, LeashDataCommand.UUID, ModPartEnum.COMMAND,
"§7UUID: §b%s", "§7UUID: §b%s",
@ -281,6 +388,9 @@ public enum SLPLangKeyValue {
"§7UUID: §b%s", "§7UUID: §b%s",
"§7UUID: §b%s" "§7UUID: §b%s"
), ),
/**
* Message leashdata get max slp lang key value.
*/
MESSAGE_LEASHDATA_GET_MAX( MESSAGE_LEASHDATA_GET_MAX(
LeashDataCommand.MAX, ModPartEnum.COMMAND, LeashDataCommand.MAX, ModPartEnum.COMMAND,
"§7Max: §a%.1f", "§7Max: §a%.1f",
@ -288,6 +398,9 @@ public enum SLPLangKeyValue {
"§7最大距離: §a%.1f", "§7最大距離: §a%.1f",
"§7極距: §a%.1f" "§7極距: §a%.1f"
), ),
/**
* Message leashdata get elastic slp lang key value.
*/
MESSAGE_LEASHDATA_GET_ELASTIC( MESSAGE_LEASHDATA_GET_ELASTIC(
LeashDataCommand.ELASTIC, ModPartEnum.COMMAND, LeashDataCommand.ELASTIC, ModPartEnum.COMMAND,
"§7Elastic: §6%.1f", "§7Elastic: §6%.1f",
@ -295,6 +408,9 @@ public enum SLPLangKeyValue {
"§7彈性距離: §6%.1f", "§7彈性距離: §6%.1f",
"§7彈距: §6%.1f" "§7彈距: §6%.1f"
), ),
/**
* Message leashdata get keep slp lang key value.
*/
MESSAGE_LEASHDATA_GET_KEEP( MESSAGE_LEASHDATA_GET_KEEP(
LeashDataCommand.KEEP, ModPartEnum.COMMAND, LeashDataCommand.KEEP, ModPartEnum.COMMAND,
"§7Keep: §c%d§7/§c%d", "§7Keep: §c%d§7/§c%d",
@ -302,6 +418,9 @@ public enum SLPLangKeyValue {
"§7保持: §c%d§7/§c%d", "§7保持: §c%d§7/§c%d",
"§7持時: §c%d§7/§c%d" "§7持時: §c%d§7/§c%d"
), ),
/**
* Message leashdata get reserved slp lang key value.
*/
MESSAGE_LEASHDATA_GET_RESERVED( MESSAGE_LEASHDATA_GET_RESERVED(
LeashDataCommand.RESERVED, ModPartEnum.COMMAND, LeashDataCommand.RESERVED, ModPartEnum.COMMAND,
"§7Reserved: §d%s", "§7Reserved: §d%s",
@ -309,6 +428,9 @@ public enum SLPLangKeyValue {
"§7保留字段: §d%s", "§7保留字段: §d%s",
"§7備註: §d%s" "§7備註: §d%s"
), ),
/**
* The Message leashdata add success.
*/
MESSAGE_LEASHDATA_ADD_SUCCESS( MESSAGE_LEASHDATA_ADD_SUCCESS(
"command.leashdata.addApplyEntity.success", ModPartEnum.COMMAND, "command.leashdata.addApplyEntity.success", ModPartEnum.COMMAND,
"§bAdded leash successfully. §a%s §7→ §e%s", "§bAdded leash successfully. §a%s §7→ §e%s",
@ -316,6 +438,9 @@ public enum SLPLangKeyValue {
"§b添加拴繩成功. §a%s §7→ §e%s", "§b添加拴繩成功. §a%s §7→ §e%s",
"§b繫繩既添. §a%s §7→ §e%s" "§b繫繩既添. §a%s §7→ §e%s"
), ),
/**
* The Message leashdata remove success.
*/
MESSAGE_LEASHDATA_REMOVE_SUCCESS( MESSAGE_LEASHDATA_REMOVE_SUCCESS(
"command.leashdata.removeApplyEntity.success", ModPartEnum.COMMAND, "command.leashdata.removeApplyEntity.success", ModPartEnum.COMMAND,
"§bRemoved leash successfully. §a%s §7- §e%s", "§bRemoved leash successfully. §a%s §7- §e%s",
@ -323,6 +448,9 @@ public enum SLPLangKeyValue {
"§b移除拴繩成功. §a%s §7- §e%s", "§b移除拴繩成功. §a%s §7- §e%s",
"§b繫繩既除. §a%s §7- §e%s" "§b繫繩既除. §a%s §7- §e%s"
), ),
/**
* The Message leashdata transfer success.
*/
MESSAGE_LEASHDATA_TRANSFER_SUCCESS( MESSAGE_LEASHDATA_TRANSFER_SUCCESS(
"command.leashdata.transfer.success", ModPartEnum.COMMAND, "command.leashdata.transfer.success", ModPartEnum.COMMAND,
"§bTransferred leash successfully. §a%s §7→ §e%s §7→ §6%s", "§bTransferred leash successfully. §a%s §7→ §e%s §7→ §6%s",
@ -330,6 +458,9 @@ public enum SLPLangKeyValue {
"§b轉移拴繩成功. §a%s §7→ §e%s §7→ §6%s", "§b轉移拴繩成功. §a%s §7→ §e%s §7→ §6%s",
"§b繫繩既移. §a%s §7→ §e%s §7→ §6%s" "§b繫繩既移. §a%s §7→ §e%s §7→ §6%s"
), ),
/**
* The Message leashdata set success.
*/
MESSAGE_LEASHDATA_SET_SUCCESS( MESSAGE_LEASHDATA_SET_SUCCESS(
"command.leashdata.setApplyEntity.success", ModPartEnum.COMMAND, "command.leashdata.setApplyEntity.success", ModPartEnum.COMMAND,
"§bSet leash property successfully. §a%s §7: §e%s §7= §6%.1f", "§bSet leash property successfully. §a%s §7: §e%s §7= §6%.1f",
@ -385,6 +516,14 @@ public enum SLPLangKeyValue {
SLPLangKeyValue(@NotNull String ResourceKey, ModPartEnum MPE, String US_EN, String SIM_CN, String TRA_CN) { SLPLangKeyValue(@NotNull String ResourceKey, ModPartEnum MPE, String US_EN, String SIM_CN, String TRA_CN) {
this(ResourceKey, MPE, US_EN, SIM_CN, TRA_CN, null, false); this(ResourceKey, MPE, US_EN, SIM_CN, TRA_CN, null, false);
} }
/**
* Gets lan.
*
* @param lan the lan
* @param key the key
* @return the lan
*/
public static String getLan(LanguageEnum lan, SLPLangKeyValue key) { public static String getLan(LanguageEnum lan, SLPLangKeyValue key) {
if (lan == null || lan == LanguageEnum.English) return getEnglish(key); if (lan == null || lan == LanguageEnum.English) return getEnglish(key);
else { else {
@ -413,10 +552,23 @@ public enum SLPLangKeyValue {
private static String getTraditionalChinese(SLPLangKeyValue key) { private static String getTraditionalChinese(SLPLangKeyValue key) {
return key.TRA_CN; return key.TRA_CN;
} }
/**
* Gets literary chinese.
*
* @param key the key
* @return the literary chinese
*/
@Nullable @Nullable
public static String getLiteraryChinese(SLPLangKeyValue key) { public static String getLiteraryChinese(SLPLangKeyValue key) {
return key.LZH; return key.LZH;
} }
/**
* Gets key.
*
* @return the key
*/
public String getKey() { public String getKey() {
if(key == null){ if(key == null){
switch (MPE) {//Don't need to use "break;"[Java feature]; switch (MPE) {//Don't need to use "break;"[Java feature];
@ -429,19 +581,43 @@ public enum SLPLangKeyValue {
} }
return key; return key;
} }
/**
* Gets item.
*
* @return the item
*/
@SuppressWarnings("null") @SuppressWarnings("null")
public Item getItem() { public Item getItem() {
assert supplier != null; assert supplier != null;
return (Item)supplier.get(); return (Item)supplier.get();
} }
/**
* Gets block.
*
* @return the block
*/
@SuppressWarnings("null") @SuppressWarnings("null")
public Block getBlock() { public Block getBlock() {
assert supplier != null; assert supplier != null;
return (Block)supplier.get(); return (Block)supplier.get();
} }
/**
* Is default item boolean.
*
* @return the boolean
*/
public boolean isDefaultItem(){ public boolean isDefaultItem(){
return MPE == ModPartEnum.ITEM && Default; return MPE == ModPartEnum.ITEM && Default;
} }
/**
* Is default block boolean.
*
* @return the boolean
*/
public boolean isDefaultBlock() { public boolean isDefaultBlock() {
return MPE == ModPartEnum.BLOCK && Default; return MPE == ModPartEnum.BLOCK && Default;
} }

View File

@ -25,7 +25,17 @@ import top.r3944realms.superleadrope.SuperLeadRope;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
/**
* The type Slp block tag provider.
*/
public class SLPBlockTagProvider extends BlockTagsProvider { public class SLPBlockTagProvider extends BlockTagsProvider {
/**
* Instantiates a new Slp block tag provider.
*
* @param output the output
* @param lookupProvider the lookup provider
* @param existingFileHelper the existing file helper
*/
public SLPBlockTagProvider( public SLPBlockTagProvider(
PackOutput output, PackOutput output,
CompletableFuture<HolderLookup.Provider> lookupProvider, CompletableFuture<HolderLookup.Provider> lookupProvider,

View File

@ -30,11 +30,26 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
/**
* The type Slp item model provider.
*/
public class SLPItemModelProvider extends ItemModelProvider { public class SLPItemModelProvider extends ItemModelProvider {
private static List<Item> objectList; private static List<Item> objectList;
/**
* The constant GENERATED.
*/
public static final String GENERATED = "item/generated"; public static final String GENERATED = "item/generated";
/**
* The constant HANDHELD.
*/
public static final String HANDHELD = "item/handheld"; public static final String HANDHELD = "item/handheld";
/**
* Instantiates a new Slp item model provider.
*
* @param output the output
* @param existingFileHelper the existing file helper
*/
public SLPItemModelProvider(PackOutput output, ExistingFileHelper existingFileHelper) { public SLPItemModelProvider(PackOutput output, ExistingFileHelper existingFileHelper) {
super(output, SuperLeadRope.MOD_ID, existingFileHelper); super(output, SuperLeadRope.MOD_ID, existingFileHelper);
objectList = new ArrayList<>(); objectList = new ArrayList<>();
@ -59,12 +74,29 @@ public class SLPItemModelProvider extends ItemModelProvider {
objectList.forEach(this::basicItem); objectList.forEach(this::basicItem);
} }
/**
* Item generate model.
*
* @param item the item
* @param location the location
*/
public void itemGenerateModel(Item item, ResourceLocation location){ public void itemGenerateModel(Item item, ResourceLocation location){
withExistingParent(itemName(item), GENERATED).texture("layer0", location); withExistingParent(itemName(item), GENERATED).texture("layer0", location);
} }
/**
* Item hand held model.
*
* @param item the item
* @param location the location
*/
public void itemHandHeldModel(Item item, ResourceLocation location){ public void itemHandHeldModel(Item item, ResourceLocation location){
withExistingParent(itemName(item), HANDHELD).texture("layer0", location); withExistingParent(itemName(item), HANDHELD).texture("layer0", location);
} }
/**
* Super lead rope model.
*/
public void superLeadRopeModel() { public void superLeadRopeModel() {
// 生成主模型支持根据 predicate 切换模型 // 生成主模型支持根据 predicate 切换模型
ItemModelBuilder builder = getBuilder(SuperLeadRope.MOD_ID + ":super_lead_rope"); ItemModelBuilder builder = getBuilder(SuperLeadRope.MOD_ID + ":super_lead_rope");
@ -83,10 +115,22 @@ public class SLPItemModelProvider extends ItemModelProvider {
.texture("layer0", resourceItem("broken_super_lead_rope")); .texture("layer0", resourceItem("broken_super_lead_rope"));
} }
/**
* Item name string.
*
* @param item the item
* @return the string
*/
public String itemName(Item item){ public String itemName(Item item){
return Objects.requireNonNull(ForgeRegistries.ITEMS.getKey(item)).getPath(); return Objects.requireNonNull(ForgeRegistries.ITEMS.getKey(item)).getPath();
} }
/**
* Resource item resource location.
*
* @param path the path
* @return the resource location
*/
public ResourceLocation resourceItem(String path){ public ResourceLocation resourceItem(String path){
return modLoc("item/" + path); return modLoc("item/" + path);
} }

View File

@ -26,7 +26,15 @@ import top.r3944realms.superleadrope.core.register.SLPItems;
import java.util.function.Consumer; import java.util.function.Consumer;
/**
* The type Slp item recipe provider.
*/
public class SLPItemRecipeProvider extends RecipeProvider { public class SLPItemRecipeProvider extends RecipeProvider {
/**
* Instantiates a new Slp item recipe provider.
*
* @param output the output
*/
public SLPItemRecipeProvider(PackOutput output) { public SLPItemRecipeProvider(PackOutput output) {
super(output); super(output);
} }

View File

@ -27,7 +27,17 @@ import top.r3944realms.superleadrope.content.SLPTags;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
/**
* The type Slp item tag provider.
*/
public class SLPItemTagProvider extends ItemTagsProvider { public class SLPItemTagProvider extends ItemTagsProvider {
/**
* Instantiates a new Slp item tag provider.
*
* @param packOutput the pack output
* @param holderProvider the holder provider
* @param existingFileHelper the existing file helper
*/
public SLPItemTagProvider( public SLPItemTagProvider(
PackOutput packOutput, PackOutput packOutput,
CompletableFuture<HolderLookup.Provider> holderProvider, CompletableFuture<HolderLookup.Provider> holderProvider,

View File

@ -29,10 +29,20 @@ import java.util.Map;
import static top.r3944realms.superleadrope.datagen.data.SLPLangKeyValue.getLan; import static top.r3944realms.superleadrope.datagen.data.SLPLangKeyValue.getLan;
/**
* The type Slp language provider.
*/
public class SLPLanguageProvider extends LanguageProvider { public class SLPLanguageProvider extends LanguageProvider {
private final LanguageEnum Language; private final LanguageEnum Language;
private final Map<String, String> LanKeyMap; private final Map<String, String> LanKeyMap;
private static final List<String> objects = new ArrayList<>(); private static final List<String> objects = new ArrayList<>();
/**
* Instantiates a new Slp language provider.
*
* @param output the output
* @param Lan the lan
*/
public SLPLanguageProvider(PackOutput output, LanguageEnum Lan) { public SLPLanguageProvider(PackOutput output, LanguageEnum Lan) {
super(output, SuperLeadRope.MOD_ID, Lan.local); super(output, SuperLeadRope.MOD_ID, Lan.local);
this.Language = Lan; this.Language = Lan;

View File

@ -22,10 +22,27 @@ import net.minecraftforge.common.data.SoundDefinitionsProvider;
import top.r3944realms.superleadrope.SuperLeadRope; import top.r3944realms.superleadrope.SuperLeadRope;
import top.r3944realms.superleadrope.core.register.SLPSoundEvents; import top.r3944realms.superleadrope.core.register.SLPSoundEvents;
/**
* The type Slp sound definitions provider.
*/
public class SLPSoundDefinitionsProvider extends SoundDefinitionsProvider { public class SLPSoundDefinitionsProvider extends SoundDefinitionsProvider {
/**
* Instantiates a new Slp sound definitions provider.
*
* @param output the output
* @param helper the helper
*/
public SLPSoundDefinitionsProvider(PackOutput output, ExistingFileHelper helper) { public SLPSoundDefinitionsProvider(PackOutput output, ExistingFileHelper helper) {
super(output, SuperLeadRope.MOD_ID, helper); super(output, SuperLeadRope.MOD_ID, helper);
} }
/**
* Gets sound definition.
*
* @param subTitle the sub title
* @param sounds the sounds
* @return the sound definition
*/
public SoundDefinition getSoundDefinition(String subTitle, SoundDefinition.Sound... sounds) { public SoundDefinition getSoundDefinition(String subTitle, SoundDefinition.Sound... sounds) {
return SoundDefinition.definition().subtitle(subTitle).with(sounds); return SoundDefinition.definition().subtitle(subTitle).with(sounds);
} }

View File

@ -25,14 +25,24 @@ import top.r3944realms.superleadrope.SuperLeadRope;
import top.r3944realms.superleadrope.network.toClient.*; import top.r3944realms.superleadrope.network.toClient.*;
/**
* The type Network handler.
*/
public class NetworkHandler { public class NetworkHandler {
private static int cid = 0; private static int cid = 0;
/**
* The constant INSTANCE.
*/
public static final SimpleChannel INSTANCE = NetworkRegistry.newSimpleChannel( public static final SimpleChannel INSTANCE = NetworkRegistry.newSimpleChannel(
new ResourceLocation(SuperLeadRope.MOD_ID, "main"), new ResourceLocation(SuperLeadRope.MOD_ID, "main"),
() -> SuperLeadRope.ModInfo.VERSION, () -> SuperLeadRope.ModInfo.VERSION,
SuperLeadRope.ModInfo.VERSION::equals, SuperLeadRope.ModInfo.VERSION::equals,
SuperLeadRope.ModInfo.VERSION::equals SuperLeadRope.ModInfo.VERSION::equals
); );
/**
* Register.
*/
public static void register() { public static void register() {
INSTANCE.messageBuilder(LeashDataSyncPacket.class, cid++, NetworkDirection.PLAY_TO_CLIENT) INSTANCE.messageBuilder(LeashDataSyncPacket.class, cid++, NetworkDirection.PLAY_TO_CLIENT)
.decoder(LeashDataSyncPacket::decode) .decoder(LeashDataSyncPacket::decode)
@ -60,9 +70,27 @@ public class NetworkHandler {
.consumerNetworkThread(LeashStateSyncPacket::handle) .consumerNetworkThread(LeashStateSyncPacket::handle)
.add(); .add();
} }
/**
* Send to player.
*
* @param <MSG> the type parameter
* @param message the message
* @param player the player
*/
public static <MSG> void sendToPlayer(MSG message, ServerPlayer player){ public static <MSG> void sendToPlayer(MSG message, ServerPlayer player){
INSTANCE.send(PacketDistributor.PLAYER.with(() -> player), message); INSTANCE.send(PacketDistributor.PLAYER.with(() -> player), message);
} }
/**
* Send to player.
*
* @param <MSG> the type parameter
* @param <T> the type parameter
* @param message the message
* @param entity the entity
* @param packetDistributor the packet distributor
*/
public static <MSG, T> void sendToPlayer(MSG message, T entity, PacketDistributor<T> packetDistributor){ public static <MSG, T> void sendToPlayer(MSG message, T entity, PacketDistributor<T> packetDistributor){
INSTANCE.send(packetDistributor.with(() -> entity), message); INSTANCE.send(packetDistributor.with(() -> entity), message);
} }

View File

@ -10,6 +10,9 @@ import top.r3944realms.superleadrope.core.punishment.PunishmentDefinition;
import java.util.UUID; import java.util.UUID;
import java.util.function.Supplier; import java.util.function.Supplier;
/**
* The type Eternal potato sync cap packet.
*/
public record EternalPotatoSyncCapPacket( public record EternalPotatoSyncCapPacket(
UUID itemUUID, UUID itemUUID,
UUID ownerUUID, UUID ownerUUID,
@ -23,7 +26,13 @@ public record EternalPotatoSyncCapPacket(
IObligationCompletion completionRule IObligationCompletion completionRule
) { ) {
// 编码 /**
* Encode.
*
* @param msg the msg
* @param buf the buf
*/
// 编码
public static void encode(EternalPotatoSyncCapPacket msg, FriendlyByteBuf buf) { public static void encode(EternalPotatoSyncCapPacket msg, FriendlyByteBuf buf) {
buf.writeUUID(msg.itemUUID); buf.writeUUID(msg.itemUUID);
@ -48,7 +57,13 @@ public record EternalPotatoSyncCapPacket(
} }
} }
// 解码 /**
* Decode eternal potato sync cap packet.
*
* @param buf the buf
* @return the eternal potato sync cap packet
*/
// 解码
public static EternalPotatoSyncCapPacket decode(FriendlyByteBuf buf) { public static EternalPotatoSyncCapPacket decode(FriendlyByteBuf buf) {
UUID itemUUID = buf.readUUID(); UUID itemUUID = buf.readUUID();
UUID ownerUUID = buf.readBoolean() ? buf.readUUID() : null; UUID ownerUUID = buf.readBoolean() ? buf.readUUID() : null;
@ -73,7 +88,13 @@ public record EternalPotatoSyncCapPacket(
lastReset, lastPunishDate, punishment, completionRule); lastReset, lastPunishDate, punishment, completionRule);
} }
// 处理 /**
* Handle.
*
* @param msg the msg
* @param ctx the ctx
*/
// 处理
public static void handle(EternalPotatoSyncCapPacket msg, Supplier<NetworkEvent.Context> ctx) { public static void handle(EternalPotatoSyncCapPacket msg, Supplier<NetworkEvent.Context> ctx) {
ctx.get().enqueueWork(() -> { ctx.get().enqueueWork(() -> {
// 获取全局能力实例 // 获取全局能力实例

View File

@ -25,17 +25,38 @@ import top.r3944realms.superleadrope.util.capability.LeashDataInnerAPI;
import java.util.function.Supplier; import java.util.function.Supplier;
/**
* The type Leash data sync packet.
*/
public record LeashDataSyncPacket(int entityId, CompoundTag leashData) { public record LeashDataSyncPacket(int entityId, CompoundTag leashData) {
/**
* Encode.
*
* @param msg the msg
* @param buffer the buffer
*/
public static void encode(LeashDataSyncPacket msg, FriendlyByteBuf buffer) { public static void encode(LeashDataSyncPacket msg, FriendlyByteBuf buffer) {
buffer.writeInt(msg.entityId); buffer.writeInt(msg.entityId);
buffer.writeNbt(msg.leashData); buffer.writeNbt(msg.leashData);
} }
/**
* Decode leash data sync packet.
*
* @param buffer the buffer
* @return the leash data sync packet
*/
public static LeashDataSyncPacket decode(FriendlyByteBuf buffer) { public static LeashDataSyncPacket decode(FriendlyByteBuf buffer) {
return new LeashDataSyncPacket(buffer.readInt(), buffer.readNbt()); return new LeashDataSyncPacket(buffer.readInt(), buffer.readNbt());
} }
/**
* Handle.
*
* @param msg the msg
* @param ctx the ctx
*/
public static void handle(LeashDataSyncPacket msg, Supplier<NetworkEvent.Context> ctx) { public static void handle(LeashDataSyncPacket msg, Supplier<NetworkEvent.Context> ctx) {
ctx.get().enqueueWork(() -> { ctx.get().enqueueWork(() -> {
ClientLevel level = Minecraft.getInstance().level; ClientLevel level = Minecraft.getInstance().level;

View File

@ -25,16 +25,37 @@ import top.r3944realms.superleadrope.api.SLPCapability;
import java.util.function.Supplier; import java.util.function.Supplier;
/**
* The type Leash state sync packet.
*/
public record LeashStateSyncPacket(int entityId, CompoundTag leashState) { public record LeashStateSyncPacket(int entityId, CompoundTag leashState) {
/**
* Encode.
*
* @param msg the msg
* @param buffer the buffer
*/
public static void encode(LeashStateSyncPacket msg, FriendlyByteBuf buffer) { public static void encode(LeashStateSyncPacket msg, FriendlyByteBuf buffer) {
buffer.writeInt(msg.entityId); buffer.writeInt(msg.entityId);
buffer.writeNbt(msg.leashState); buffer.writeNbt(msg.leashState);
} }
/**
* Decode leash state sync packet.
*
* @param buffer the buffer
* @return the leash state sync packet
*/
public static LeashStateSyncPacket decode(FriendlyByteBuf buffer) { public static LeashStateSyncPacket decode(FriendlyByteBuf buffer) {
return new LeashStateSyncPacket(buffer.readInt(), buffer.readNbt()); return new LeashStateSyncPacket(buffer.readInt(), buffer.readNbt());
} }
/**
* Handle.
*
* @param msg the msg
* @param ctx the ctx
*/
public static void handle(LeashStateSyncPacket msg, Supplier<NetworkEvent.Context> ctx) { public static void handle(LeashStateSyncPacket msg, Supplier<NetworkEvent.Context> ctx) {
ctx.get().enqueueWork(() -> { ctx.get().enqueueWork(() -> {
ClientLevel level = Minecraft.getInstance().level; ClientLevel level = Minecraft.getInstance().level;

View File

@ -22,15 +22,36 @@ import top.r3944realms.superleadrope.core.potato.EternalPotatoFacade;
import java.util.UUID; import java.util.UUID;
import java.util.function.Supplier; import java.util.function.Supplier;
/**
* The type Packet eternal potato remove packet.
*/
public record PacketEternalPotatoRemovePacket(UUID itemUUID) { public record PacketEternalPotatoRemovePacket(UUID itemUUID) {
/**
* Encode.
*
* @param msg the msg
* @param buf the buf
*/
public static void encode(PacketEternalPotatoRemovePacket msg, FriendlyByteBuf buf) { public static void encode(PacketEternalPotatoRemovePacket msg, FriendlyByteBuf buf) {
buf.writeUUID(msg.itemUUID()); buf.writeUUID(msg.itemUUID());
} }
/**
* Decode packet eternal potato remove packet.
*
* @param buf the buf
* @return the packet eternal potato remove packet
*/
public static PacketEternalPotatoRemovePacket decode(FriendlyByteBuf buf) { public static PacketEternalPotatoRemovePacket decode(FriendlyByteBuf buf) {
return new PacketEternalPotatoRemovePacket(buf.readUUID()); return new PacketEternalPotatoRemovePacket(buf.readUUID());
} }
/**
* Handle.
*
* @param msg the msg
* @param ctx the ctx
*/
public static void handle(PacketEternalPotatoRemovePacket msg, Supplier<NetworkEvent.Context> ctx) { public static void handle(PacketEternalPotatoRemovePacket msg, Supplier<NetworkEvent.Context> ctx) {
ctx.get().enqueueWork(() -> { ctx.get().enqueueWork(() -> {
// 客户端收到移除请求 // 客户端收到移除请求

View File

@ -23,17 +23,39 @@ import net.minecraftforge.network.NetworkEvent;
import java.util.function.Supplier; import java.util.function.Supplier;
/**
* The type Update player movement packet.
*/
public record UpdatePlayerMovementPacket(Operation operation, double x, double y, double z) { public record UpdatePlayerMovementPacket(Operation operation, double x, double y, double z) {
/**
* Encode.
*
* @param packet the packet
* @param buffer the buffer
*/
public static void encode(UpdatePlayerMovementPacket packet, FriendlyByteBuf buffer) { public static void encode(UpdatePlayerMovementPacket packet, FriendlyByteBuf buffer) {
buffer.writeEnum(packet.operation()); buffer.writeEnum(packet.operation());
buffer.writeDouble(packet.x()); buffer.writeDouble(packet.x());
buffer.writeDouble(packet.y()); buffer.writeDouble(packet.y());
buffer.writeDouble(packet.z()); buffer.writeDouble(packet.z());
} }
/**
* Instantiates a new Update player movement packet.
*
* @param operation the operation
* @param vec the vec
*/
public UpdatePlayerMovementPacket(Operation operation, Vec3 vec) { public UpdatePlayerMovementPacket(Operation operation, Vec3 vec) {
this(operation, vec.x, vec.y, vec.z); this(operation, vec.x, vec.y, vec.z);
} }
/**
* Decode update player movement packet.
*
* @param buffer the buffer
* @return the update player movement packet
*/
public static UpdatePlayerMovementPacket decode(FriendlyByteBuf buffer) { public static UpdatePlayerMovementPacket decode(FriendlyByteBuf buffer) {
return new UpdatePlayerMovementPacket( return new UpdatePlayerMovementPacket(
buffer.readEnum(Operation.class), buffer.readEnum(Operation.class),
@ -43,6 +65,12 @@ public record UpdatePlayerMovementPacket(Operation operation, double x, double y
); );
} }
/**
* Handle.
*
* @param packet the packet
* @param ctx the ctx
*/
public static void handle(UpdatePlayerMovementPacket packet, Supplier<NetworkEvent.Context> ctx) { public static void handle(UpdatePlayerMovementPacket packet, Supplier<NetworkEvent.Context> ctx) {
NetworkEvent.Context context = ctx.get(); NetworkEvent.Context context = ctx.get();
context.enqueueWork(() -> { context.enqueueWork(() -> {
@ -57,9 +85,22 @@ public record UpdatePlayerMovementPacket(Operation operation, double x, double y
); );
context.setPacketHandled(true); context.setPacketHandled(true);
} }
/**
* The enum Operation.
*/
public enum Operation { public enum Operation {
/**
* Set operation.
*/
SET, SET,
/**
* Add operation.
*/
ADD, ADD,
/**
* Multiply operation.
*/
MULTIPLY MULTIPLY
} }
} }

View File

@ -32,75 +32,192 @@ import java.util.*;
@SuppressWarnings("unused") @SuppressWarnings("unused")
@ApiStatus.Internal @ApiStatus.Internal
public final class LeashDataInnerAPI { public final class LeashDataInnerAPI {
// ==================== 基础能力获取 ==================== /**
* Gets leash data.
*
* @param entity the entity
* @return the leash data
*/
// ==================== 基础能力获取 ====================
public static @NotNull Optional<ILeashData> getLeashData(@NotNull Entity entity) { public static @NotNull Optional<ILeashData> getLeashData(@NotNull Entity entity) {
Objects.requireNonNull(entity, "Entity cannot be null"); Objects.requireNonNull(entity, "Entity cannot be null");
return entity.getCapability(SLPCapability.LEASH_DATA_CAP).resolve(); return entity.getCapability(SLPCapability.LEASH_DATA_CAP).resolve();
} }
// ==================== 拴绳数据管理 API ==================== // ==================== 拴绳数据管理 API ====================
/**
* The type Leash operations.
*/
public static final class LeashOperations { public static final class LeashOperations {
private LeashOperations() {} private LeashOperations() {}
// ---------------------- 添加拴绳 ---------------------- /**
* Attach boolean.
*
* @param entity the entity
* @param holder the holder
* @return the boolean
*/
// ---------------------- 添加拴绳 ----------------------
public static boolean attach(Entity entity, Entity holder) { public static boolean attach(Entity entity, Entity holder) {
return getLeashData(entity).map(data -> data.addLeash(holder)).orElse(false); return getLeashData(entity).map(data -> data.addLeash(holder)).orElse(false);
} }
/**
* Attach boolean.
*
* @param entity the entity
* @param holder the holder
* @param reserved the reserved
* @return the boolean
*/
public static boolean attach(Entity entity, Entity holder, String reserved) { public static boolean attach(Entity entity, Entity holder, String reserved) {
return getLeashData(entity).map(data -> data.addLeash(holder, reserved)).orElse(false); return getLeashData(entity).map(data -> data.addLeash(holder, reserved)).orElse(false);
} }
/**
* Attach boolean.
*
* @param entity the entity
* @param holder the holder
* @param maxDistance the max distance
* @return the boolean
*/
public static boolean attach(Entity entity, Entity holder, double maxDistance) { public static boolean attach(Entity entity, Entity holder, double maxDistance) {
return getLeashData(entity).map(data -> data.addLeash(holder, maxDistance)).orElse(false); return getLeashData(entity).map(data -> data.addLeash(holder, maxDistance)).orElse(false);
} }
/**
* Attach boolean.
*
* @param entity the entity
* @param holder the holder
* @param maxDistance the max distance
* @param elasticDistance the elastic distance
* @param maxKeepTicks the max keep ticks
* @return the boolean
*/
public static boolean attach(Entity entity, Entity holder, double maxDistance, double elasticDistance, int maxKeepTicks) { public static boolean attach(Entity entity, Entity holder, double maxDistance, double elasticDistance, int maxKeepTicks) {
return getLeashData(entity).map(data -> data.addLeash(holder, maxDistance, elasticDistance, maxKeepTicks)).orElse(false); return getLeashData(entity).map(data -> data.addLeash(holder, maxDistance, elasticDistance, maxKeepTicks)).orElse(false);
} }
/**
* Attach boolean.
*
* @param entity the entity
* @param holder the holder
* @param maxDistance the max distance
* @param reserved the reserved
* @return the boolean
*/
public static boolean attach(Entity entity, Entity holder, double maxDistance, String reserved) { public static boolean attach(Entity entity, Entity holder, double maxDistance, String reserved) {
return getLeashData(entity).map(data -> data.addLeash(holder, maxDistance, reserved)).orElse(false); return getLeashData(entity).map(data -> data.addLeash(holder, maxDistance, reserved)).orElse(false);
} }
/**
* Attach boolean.
*
* @param entity the entity
* @param holder the holder
* @param maxDistance the max distance
* @param elasticDistance the elastic distance
* @param maxKeepTicks the max keep ticks
* @param reserved the reserved
* @return the boolean
*/
public static boolean attach(Entity entity, Entity holder, double maxDistance, double elasticDistance, int maxKeepTicks, String reserved) { public static boolean attach(Entity entity, Entity holder, double maxDistance, double elasticDistance, int maxKeepTicks, String reserved) {
return getLeashData(entity).map(data -> data.addLeash(holder, maxDistance, elasticDistance, maxKeepTicks, reserved)).orElse(false); return getLeashData(entity).map(data -> data.addLeash(holder, maxDistance, elasticDistance, maxKeepTicks, reserved)).orElse(false);
} }
/**
* Attach with info.
*
* @param entity the entity
* @param holder the holder
* @param info the info
*/
public static void attachWithInfo(Entity entity, Entity holder, LeashInfo info) { public static void attachWithInfo(Entity entity, Entity holder, LeashInfo info) {
getLeashData(entity).ifPresent(data -> data.addLeash(holder, info)); getLeashData(entity).ifPresent(data -> data.addLeash(holder, info));
} }
// ---------------------- 延迟拴绳 ---------------------- /**
* Attach delayed.
*
* @param entity the entity
* @param holderPlayer the holder player
*/
// ---------------------- 延迟拴绳 ----------------------
public static void attachDelayed(Entity entity, Player holderPlayer) { public static void attachDelayed(Entity entity, Player holderPlayer) {
getLeashData(entity).ifPresent(data -> data.addDelayedLeash(holderPlayer)); getLeashData(entity).ifPresent(data -> data.addDelayedLeash(holderPlayer));
} }
/**
* Remove delayed.
*
* @param entity the entity
* @param onceHolderPlayerUUID the once holder player uuid
*/
public static void removeDelayed(Entity entity, UUID onceHolderPlayerUUID) { public static void removeDelayed(Entity entity, UUID onceHolderPlayerUUID) {
getLeashData(entity).ifPresent(data -> data.removeDelayedLeash(onceHolderPlayerUUID)); getLeashData(entity).ifPresent(data -> data.removeDelayedLeash(onceHolderPlayerUUID));
} }
// ---------------------- 移除拴绳 ---------------------- /**
* Detach boolean.
*
* @param entity the entity
* @param holder the holder
* @return the boolean
*/
// ---------------------- 移除拴绳 ----------------------
public static boolean detach(Entity entity, Entity holder) { public static boolean detach(Entity entity, Entity holder) {
return getLeashData(entity).map(data -> data.removeLeash(holder)).orElse(false); return getLeashData(entity).map(data -> data.removeLeash(holder)).orElse(false);
} }
/**
* Detach boolean.
*
* @param entity the entity
* @param holderUUID the holder uuid
* @return the boolean
*/
public static boolean detach(Entity entity, UUID holderUUID) { public static boolean detach(Entity entity, UUID holderUUID) {
return getLeashData(entity).map(data -> data.removeLeash(holderUUID)).orElse(false); return getLeashData(entity).map(data -> data.removeLeash(holderUUID)).orElse(false);
} }
/**
* Detach boolean.
*
* @param entity the entity
* @param knotPos the knot pos
* @return the boolean
*/
public static boolean detach(Entity entity, BlockPos knotPos) { public static boolean detach(Entity entity, BlockPos knotPos) {
return getLeashData(entity).map(data -> data.removeLeash(knotPos)).orElse(false); return getLeashData(entity).map(data -> data.removeLeash(knotPos)).orElse(false);
} }
/**
* Detach all.
*
* @param entity the entity
*/
public static void detachAll(Entity entity) { public static void detachAll(Entity entity) {
getLeashData(entity).ifPresent(ILeashData::removeAllLeashes); getLeashData(entity).ifPresent(ILeashData::removeAllLeashes);
} }
/**
* Detach all holders.
*
* @param entity the entity
*/
public static void detachAllHolders(Entity entity) { public static void detachAllHolders(Entity entity) {
getLeashData(entity).ifPresent(ILeashData::removeAllHolderLeashes); getLeashData(entity).ifPresent(ILeashData::removeAllHolderLeashes);
} }
/**
* Detach all knots.
*
* @param entity the entity
*/
public static void detachAllKnots(Entity entity) { public static void detachAllKnots(Entity entity) {
getLeashData(entity).ifPresent(ILeashData::removeAllKnotLeashes); getLeashData(entity).ifPresent(ILeashData::removeAllKnotLeashes);
} }
@ -108,79 +225,244 @@ public final class LeashDataInnerAPI {
// ==================== 拴绳属性修改 API ==================== // ==================== 拴绳属性修改 API ====================
/**
* The type Property operations.
*/
public static final class PropertyOperations { public static final class PropertyOperations {
private PropertyOperations() {} private PropertyOperations() {}
// ---------------------- 设置最大距离 ---------------------- /**
* Sets max distance.
*
* @param entity the entity
* @param holder the holder
* @param distance the distance
* @return the max distance
*/
// ---------------------- 设置最大距离 ----------------------
public static boolean setMaxDistance(Entity entity, Entity holder, double distance) { public static boolean setMaxDistance(Entity entity, Entity holder, double distance) {
return getLeashData(entity).map(data -> data.setMaxDistance(holder, distance)).orElse(false); return getLeashData(entity).map(data -> data.setMaxDistance(holder, distance)).orElse(false);
} }
/**
* Sets max distance.
*
* @param entity the entity
* @param holder the holder
* @param distance the distance
* @param maxKeepTicks the max keep ticks
* @return the max distance
*/
public static boolean setMaxDistance(Entity entity, Entity holder, double distance, int maxKeepTicks) { public static boolean setMaxDistance(Entity entity, Entity holder, double distance, int maxKeepTicks) {
return getLeashData(entity).map(data -> data.setMaxDistance(holder, distance, maxKeepTicks)).orElse(false); return getLeashData(entity).map(data -> data.setMaxDistance(holder, distance, maxKeepTicks)).orElse(false);
} }
/**
* Sets max distance.
*
* @param entity the entity
* @param holder the holder
* @param distance the distance
* @param maxKeepTicks the max keep ticks
* @param reserved the reserved
* @return the max distance
*/
public static boolean setMaxDistance(Entity entity, Entity holder, double distance, int maxKeepTicks, String reserved) { public static boolean setMaxDistance(Entity entity, Entity holder, double distance, int maxKeepTicks, String reserved) {
return getLeashData(entity).map(data -> data.setMaxDistance(holder, distance, maxKeepTicks, reserved)).orElse(false); return getLeashData(entity).map(data -> data.setMaxDistance(holder, distance, maxKeepTicks, reserved)).orElse(false);
} }
/**
* Sets max distance.
*
* @param entity the entity
* @param holderUUID the holder uuid
* @param distance the distance
* @return the max distance
*/
public static boolean setMaxDistance(Entity entity, UUID holderUUID, double distance) { public static boolean setMaxDistance(Entity entity, UUID holderUUID, double distance) {
return getLeashData(entity).map(data -> data.setMaxDistance(holderUUID, distance)).orElse(false); return getLeashData(entity).map(data -> data.setMaxDistance(holderUUID, distance)).orElse(false);
} }
/**
* Sets max distance.
*
* @param entity the entity
* @param holderUUID the holder uuid
* @param distance the distance
* @param maxKeepTicks the max keep ticks
* @return the max distance
*/
public static boolean setMaxDistance(Entity entity, UUID holderUUID, double distance, int maxKeepTicks) { public static boolean setMaxDistance(Entity entity, UUID holderUUID, double distance, int maxKeepTicks) {
return getLeashData(entity).map(data -> data.setMaxDistance(holderUUID, distance, maxKeepTicks)).orElse(false); return getLeashData(entity).map(data -> data.setMaxDistance(holderUUID, distance, maxKeepTicks)).orElse(false);
} }
/**
* Sets max distance.
*
* @param entity the entity
* @param holderUUID the holder uuid
* @param distance the distance
* @param maxKeepTicks the max keep ticks
* @param reserved the reserved
* @return the max distance
*/
public static boolean setMaxDistance(Entity entity, UUID holderUUID, double distance, int maxKeepTicks, String reserved) { public static boolean setMaxDistance(Entity entity, UUID holderUUID, double distance, int maxKeepTicks, String reserved) {
return getLeashData(entity).map(data -> data.setMaxDistance(holderUUID, distance, maxKeepTicks, reserved)).orElse(false); return getLeashData(entity).map(data -> data.setMaxDistance(holderUUID, distance, maxKeepTicks, reserved)).orElse(false);
} }
/**
* Sets max distance.
*
* @param entity the entity
* @param knotPos the knot pos
* @param distance the distance
* @return the max distance
*/
public static boolean setMaxDistance(Entity entity, BlockPos knotPos, double distance) { public static boolean setMaxDistance(Entity entity, BlockPos knotPos, double distance) {
return getLeashData(entity).map(data -> data.setMaxDistance(knotPos, distance)).orElse(false); return getLeashData(entity).map(data -> data.setMaxDistance(knotPos, distance)).orElse(false);
} }
/**
* Sets max distance.
*
* @param entity the entity
* @param knotPos the knot pos
* @param distance the distance
* @param maxKeepTicks the max keep ticks
* @return the max distance
*/
public static boolean setMaxDistance(Entity entity, BlockPos knotPos, double distance, int maxKeepTicks) { public static boolean setMaxDistance(Entity entity, BlockPos knotPos, double distance, int maxKeepTicks) {
return getLeashData(entity).map(data -> data.setMaxDistance(knotPos, distance, maxKeepTicks)).orElse(false); return getLeashData(entity).map(data -> data.setMaxDistance(knotPos, distance, maxKeepTicks)).orElse(false);
} }
/**
* Sets max distance.
*
* @param entity the entity
* @param knotPos the knot pos
* @param distance the distance
* @param maxKeepTicks the max keep ticks
* @param reserved the reserved
* @return the max distance
*/
public static boolean setMaxDistance(Entity entity, BlockPos knotPos, double distance, int maxKeepTicks, String reserved) { public static boolean setMaxDistance(Entity entity, BlockPos knotPos, double distance, int maxKeepTicks, String reserved) {
return getLeashData(entity).map(data -> data.setMaxDistance(knotPos, distance, maxKeepTicks, reserved)).orElse(false); return getLeashData(entity).map(data -> data.setMaxDistance(knotPos, distance, maxKeepTicks, reserved)).orElse(false);
} }
// ---------------------- 设置弹性距离 ---------------------- /**
* Sets elastic distance.
*
* @param entity the entity
* @param holder the holder
* @param distance the distance
* @return the elastic distance
*/
// ---------------------- 设置弹性距离 ----------------------
public static boolean setElasticDistance(Entity entity, Entity holder, double distance) { public static boolean setElasticDistance(Entity entity, Entity holder, double distance) {
return getLeashData(entity).map(data -> data.setElasticDistanceScale(holder, distance)).orElse(false); return getLeashData(entity).map(data -> data.setElasticDistanceScale(holder, distance)).orElse(false);
} }
/**
* Sets elastic distance.
*
* @param entity the entity
* @param holder the holder
* @param distance the distance
* @param maxKeepTicks the max keep ticks
* @return the elastic distance
*/
public static boolean setElasticDistance(Entity entity, Entity holder, double distance, int maxKeepTicks) { public static boolean setElasticDistance(Entity entity, Entity holder, double distance, int maxKeepTicks) {
return getLeashData(entity).map(data -> data.setElasticDistanceScale(holder, distance, maxKeepTicks)).orElse(false); return getLeashData(entity).map(data -> data.setElasticDistanceScale(holder, distance, maxKeepTicks)).orElse(false);
} }
/**
* Sets elastic distance.
*
* @param entity the entity
* @param holder the holder
* @param distance the distance
* @param maxKeepTicks the max keep ticks
* @param reserved the reserved
* @return the elastic distance
*/
public static boolean setElasticDistance(Entity entity, Entity holder, double distance, int maxKeepTicks, String reserved) { public static boolean setElasticDistance(Entity entity, Entity holder, double distance, int maxKeepTicks, String reserved) {
return getLeashData(entity).map(data -> data.setElasticDistanceScale(holder, distance, maxKeepTicks, reserved)).orElse(false); return getLeashData(entity).map(data -> data.setElasticDistanceScale(holder, distance, maxKeepTicks, reserved)).orElse(false);
} }
/**
* Sets elastic distance.
*
* @param entity the entity
* @param holderUUID the holder uuid
* @param distance the distance
* @return the elastic distance
*/
public static boolean setElasticDistance(Entity entity, UUID holderUUID, double distance) { public static boolean setElasticDistance(Entity entity, UUID holderUUID, double distance) {
return getLeashData(entity).map(data -> data.setElasticDistanceScale(holderUUID, distance)).orElse(false); return getLeashData(entity).map(data -> data.setElasticDistanceScale(holderUUID, distance)).orElse(false);
} }
/**
* Sets elastic distance.
*
* @param entity the entity
* @param holderUUID the holder uuid
* @param distance the distance
* @param maxKeepTicks the max keep ticks
* @return the elastic distance
*/
public static boolean setElasticDistance(Entity entity, UUID holderUUID, double distance, int maxKeepTicks) { public static boolean setElasticDistance(Entity entity, UUID holderUUID, double distance, int maxKeepTicks) {
return getLeashData(entity).map(data -> data.setElasticDistanceScale(holderUUID, distance, maxKeepTicks)).orElse(false); return getLeashData(entity).map(data -> data.setElasticDistanceScale(holderUUID, distance, maxKeepTicks)).orElse(false);
} }
/**
* Sets elastic distance.
*
* @param entity the entity
* @param holderUUID the holder uuid
* @param distance the distance
* @param maxKeepTicks the max keep ticks
* @param reserved the reserved
* @return the elastic distance
*/
public static boolean setElasticDistance(Entity entity, UUID holderUUID, double distance, int maxKeepTicks, String reserved) { public static boolean setElasticDistance(Entity entity, UUID holderUUID, double distance, int maxKeepTicks, String reserved) {
return getLeashData(entity).map(data -> data.setElasticDistanceScale(holderUUID, distance, maxKeepTicks, reserved)).orElse(false); return getLeashData(entity).map(data -> data.setElasticDistanceScale(holderUUID, distance, maxKeepTicks, reserved)).orElse(false);
} }
/**
* Sets elastic distance.
*
* @param entity the entity
* @param knotPos the knot pos
* @param distance the distance
* @return the elastic distance
*/
public static boolean setElasticDistance(Entity entity, BlockPos knotPos, double distance) { public static boolean setElasticDistance(Entity entity, BlockPos knotPos, double distance) {
return getLeashData(entity).map(data -> data.setElasticDistanceScale(knotPos, distance)).orElse(false); return getLeashData(entity).map(data -> data.setElasticDistanceScale(knotPos, distance)).orElse(false);
} }
/**
* Sets elastic distance.
*
* @param entity the entity
* @param knotPos the knot pos
* @param distance the distance
* @param maxKeepTicks the max keep ticks
* @return the elastic distance
*/
public static boolean setElasticDistance(Entity entity, BlockPos knotPos, double distance, int maxKeepTicks) { public static boolean setElasticDistance(Entity entity, BlockPos knotPos, double distance, int maxKeepTicks) {
return getLeashData(entity).map(data -> data.setElasticDistanceScale(knotPos, distance, maxKeepTicks)).orElse(false); return getLeashData(entity).map(data -> data.setElasticDistanceScale(knotPos, distance, maxKeepTicks)).orElse(false);
} }
/**
* Sets elastic distance.
*
* @param entity the entity
* @param knotPos the knot pos
* @param distance the distance
* @param maxKeepTicks the max keep ticks
* @param reserved the reserved
* @return the elastic distance
*/
public static boolean setElasticDistance(Entity entity, BlockPos knotPos, double distance, int maxKeepTicks, String reserved) { public static boolean setElasticDistance(Entity entity, BlockPos knotPos, double distance, int maxKeepTicks, String reserved) {
return getLeashData(entity).map(data -> data.setElasticDistanceScale(knotPos, distance, maxKeepTicks, reserved)).orElse(false); return getLeashData(entity).map(data -> data.setElasticDistanceScale(knotPos, distance, maxKeepTicks, reserved)).orElse(false);
} }
@ -188,9 +470,17 @@ public final class LeashDataInnerAPI {
// ==================== 物理应用 API ==================== // ==================== 物理应用 API ====================
/**
* The type Physics operations.
*/
public static final class PhysicsOperations { public static final class PhysicsOperations {
private PhysicsOperations() {} private PhysicsOperations() {}
/**
* Apply forces.
*
* @param entity the entity
*/
public static void applyForces(Entity entity) { public static void applyForces(Entity entity) {
getLeashData(entity).ifPresent(ILeashData::applyLeashForces); getLeashData(entity).ifPresent(ILeashData::applyLeashForces);
} }
@ -198,29 +488,83 @@ public final class LeashDataInnerAPI {
// ==================== 拴绳转移 API ==================== // ==================== 拴绳转移 API ====================
/**
* The type Transfer operations.
*/
public static final class TransferOperations { public static final class TransferOperations {
private TransferOperations() {} private TransferOperations() {}
/**
* Transfer boolean.
*
* @param entity the entity
* @param holder the holder
* @param newHolder the new holder
* @return the boolean
*/
public static boolean transfer(Entity entity, Entity holder, Entity newHolder) { public static boolean transfer(Entity entity, Entity holder, Entity newHolder) {
return getLeashData(entity).map(data -> data.transferLeash(holder, newHolder)).orElse(false); return getLeashData(entity).map(data -> data.transferLeash(holder, newHolder)).orElse(false);
} }
/**
* Transfer boolean.
*
* @param entity the entity
* @param holder the holder
* @param newHolder the new holder
* @param reserved the reserved
* @return the boolean
*/
public static boolean transfer(Entity entity, Entity holder, Entity newHolder, String reserved) { public static boolean transfer(Entity entity, Entity holder, Entity newHolder, String reserved) {
return getLeashData(entity).map(data -> data.transferLeash(holder, newHolder, reserved)).orElse(false); return getLeashData(entity).map(data -> data.transferLeash(holder, newHolder, reserved)).orElse(false);
} }
/**
* Transfer boolean.
*
* @param entity the entity
* @param holderUUID the holder uuid
* @param newHolder the new holder
* @return the boolean
*/
public static boolean transfer(Entity entity, UUID holderUUID, Entity newHolder) { public static boolean transfer(Entity entity, UUID holderUUID, Entity newHolder) {
return getLeashData(entity).map(data -> data.transferLeash(holderUUID, newHolder)).orElse(false); return getLeashData(entity).map(data -> data.transferLeash(holderUUID, newHolder)).orElse(false);
} }
/**
* Transfer boolean.
*
* @param entity the entity
* @param holderUUID the holder uuid
* @param newHolder the new holder
* @param reserved the reserved
* @return the boolean
*/
public static boolean transfer(Entity entity, UUID holderUUID, Entity newHolder, String reserved) { public static boolean transfer(Entity entity, UUID holderUUID, Entity newHolder, String reserved) {
return getLeashData(entity).map(data -> data.transferLeash(holderUUID, newHolder, reserved)).orElse(false); return getLeashData(entity).map(data -> data.transferLeash(holderUUID, newHolder, reserved)).orElse(false);
} }
/**
* Transfer boolean.
*
* @param entity the entity
* @param knotPos the knot pos
* @param newHolder the new holder
* @return the boolean
*/
public static boolean transfer(Entity entity, BlockPos knotPos, Entity newHolder) { public static boolean transfer(Entity entity, BlockPos knotPos, Entity newHolder) {
return getLeashData(entity).map(data -> data.transferLeash(knotPos, newHolder)).orElse(false); return getLeashData(entity).map(data -> data.transferLeash(knotPos, newHolder)).orElse(false);
} }
/**
* Transfer boolean.
*
* @param entity the entity
* @param knotPos the knot pos
* @param newHolder the new holder
* @param reserved the reserved
* @return the boolean
*/
public static boolean transfer(Entity entity, BlockPos knotPos, Entity newHolder, String reserved) { public static boolean transfer(Entity entity, BlockPos knotPos, Entity newHolder, String reserved) {
return getLeashData(entity).map(data -> data.transferLeash(knotPos, newHolder, reserved)).orElse(false); return getLeashData(entity).map(data -> data.transferLeash(knotPos, newHolder, reserved)).orElse(false);
} }
@ -228,57 +572,146 @@ public final class LeashDataInnerAPI {
// ==================== 查询操作 API ==================== // ==================== 查询操作 API ====================
/**
* The type Query operations.
*/
public static final class QueryOperations { public static final class QueryOperations {
private QueryOperations() {} private QueryOperations() {}
/**
* Has leash boolean.
*
* @param entity the entity
* @return the boolean
*/
public static boolean hasLeash(Entity entity) { public static boolean hasLeash(Entity entity) {
return getLeashData(entity).map(ILeashData::hasLeash).orElse(false); return getLeashData(entity).map(ILeashData::hasLeash).orElse(false);
} }
/**
* Has knot leash boolean.
*
* @param entity the entity
* @return the boolean
*/
public static boolean hasKnotLeash(Entity entity) { public static boolean hasKnotLeash(Entity entity) {
return getLeashData(entity).map(ILeashData::hasKnotLeash).orElse(false); return getLeashData(entity).map(ILeashData::hasKnotLeash).orElse(false);
} }
/**
* Has holder leash boolean.
*
* @param entity the entity
* @return the boolean
*/
public static boolean hasHolderLeash(Entity entity) { public static boolean hasHolderLeash(Entity entity) {
return getLeashData(entity).map(ILeashData::hasHolderLeash).orElse(false); return getLeashData(entity).map(ILeashData::hasHolderLeash).orElse(false);
} }
/**
* Gets all leashes.
*
* @param entity the entity
* @return the all leashes
*/
public static Collection<LeashInfo> getAllLeashes(Entity entity) { public static Collection<LeashInfo> getAllLeashes(Entity entity) {
return getLeashData(entity).map(ILeashData::getAllLeashes).orElse(Collections.emptyList()); return getLeashData(entity).map(ILeashData::getAllLeashes).orElse(Collections.emptyList());
} }
/**
* Is leashed by boolean.
*
* @param entity the entity
* @param holder the holder
* @return the boolean
*/
public static boolean isLeashedBy(Entity entity, Entity holder) { public static boolean isLeashedBy(Entity entity, Entity holder) {
return getLeashData(entity).map(data -> data.isLeashedBy(holder)).orElse(false); return getLeashData(entity).map(data -> data.isLeashedBy(holder)).orElse(false);
} }
/**
* Is leashed by boolean.
*
* @param entity the entity
* @param holderUUID the holder uuid
* @return the boolean
*/
public static boolean isLeashedBy(Entity entity, UUID holderUUID) { public static boolean isLeashedBy(Entity entity, UUID holderUUID) {
return getLeashData(entity).map(data -> data.isLeashedBy(holderUUID)).orElse(false); return getLeashData(entity).map(data -> data.isLeashedBy(holderUUID)).orElse(false);
} }
/**
* Is leashed by boolean.
*
* @param entity the entity
* @param knotPos the knot pos
* @return the boolean
*/
public static boolean isLeashedBy(Entity entity, BlockPos knotPos) { public static boolean isLeashedBy(Entity entity, BlockPos knotPos) {
return getLeashData(entity).map(data -> data.isLeashedBy(knotPos)).orElse(false); return getLeashData(entity).map(data -> data.isLeashedBy(knotPos)).orElse(false);
} }
/**
* Is in delayed leash boolean.
*
* @param entity the entity
* @param holderUUID the holder uuid
* @return the boolean
*/
public static boolean isInDelayedLeash(Entity entity, UUID holderUUID) { public static boolean isInDelayedLeash(Entity entity, UUID holderUUID) {
return getLeashData(entity).map(data -> data.isInDelayedLeash(holderUUID)).orElse(false); return getLeashData(entity).map(data -> data.isInDelayedLeash(holderUUID)).orElse(false);
} }
/**
* Gets leash info.
*
* @param entity the entity
* @param holder the holder
* @return the leash info
*/
public static Optional<LeashInfo> getLeashInfo(Entity entity, Entity holder) { public static Optional<LeashInfo> getLeashInfo(Entity entity, Entity holder) {
return getLeashData(entity).flatMap(data -> data.getLeashInfo(holder)); return getLeashData(entity).flatMap(data -> data.getLeashInfo(holder));
} }
/**
* Gets leash info.
*
* @param entity the entity
* @param holderUUID the holder uuid
* @return the leash info
*/
public static Optional<LeashInfo> getLeashInfo(Entity entity, UUID holderUUID) { public static Optional<LeashInfo> getLeashInfo(Entity entity, UUID holderUUID) {
return getLeashData(entity).flatMap(data -> data.getLeashInfo(holderUUID)); return getLeashData(entity).flatMap(data -> data.getLeashInfo(holderUUID));
} }
/**
* Gets leash info.
*
* @param entity the entity
* @param knotPos the knot pos
* @return the leash info
*/
public static Optional<LeashInfo> getLeashInfo(Entity entity, BlockPos knotPos) { public static Optional<LeashInfo> getLeashInfo(Entity entity, BlockPos knotPos) {
return getLeashData(entity).flatMap(data -> data.getLeashInfo(knotPos)); return getLeashData(entity).flatMap(data -> data.getLeashInfo(knotPos));
} }
/**
* Can be leashed boolean.
*
* @param entity the entity
* @return the boolean
*/
public static boolean canBeLeashed(Entity entity) { public static boolean canBeLeashed(Entity entity) {
return getLeashData(entity).map(ILeashData::canBeLeashed).orElse(false); return getLeashData(entity).map(ILeashData::canBeLeashed).orElse(false);
} }
/**
* Can be attached to boolean.
*
* @param entity the entity
* @param target the target
* @return the boolean
*/
public static boolean canBeAttachedTo(Entity entity, Entity target) { public static boolean canBeAttachedTo(Entity entity, Entity target) {
return getLeashData(entity).map(data -> data.canBeAttachedTo(target)).orElse(false); return getLeashData(entity).map(data -> data.canBeAttachedTo(target)).orElse(false);
} }
@ -286,21 +719,45 @@ public final class LeashDataInnerAPI {
// ==================== 占用和同步 API ==================== // ==================== 占用和同步 API ====================
/**
* The type Management operations.
*/
public static final class ManagementOperations { public static final class ManagementOperations {
private ManagementOperations() {} private ManagementOperations() {}
/**
* Occupy leash optional.
*
* @param entity the entity
* @return the optional
*/
public static Optional<UUID> occupyLeash(Entity entity) { public static Optional<UUID> occupyLeash(Entity entity) {
return getLeashData(entity).flatMap(ILeashData::occupyLeash); return getLeashData(entity).flatMap(ILeashData::occupyLeash);
} }
/**
* Mark for sync.
*
* @param entity the entity
*/
public static void markForSync(Entity entity) { public static void markForSync(Entity entity) {
getLeashData(entity).ifPresent(ILeashData::markForSync); getLeashData(entity).ifPresent(ILeashData::markForSync);
} }
/**
* Immediate sync.
*
* @param entity the entity
*/
public static void immediateSync(Entity entity) { public static void immediateSync(Entity entity) {
getLeashData(entity).ifPresent(ILeashData::immediateSync); getLeashData(entity).ifPresent(ILeashData::immediateSync);
} }
/**
* Check sync.
*
* @param entity the entity
*/
public static void checkSync(Entity entity) { public static void checkSync(Entity entity) {
getLeashData(entity).ifPresent(ILeashData::checkSync); getLeashData(entity).ifPresent(ILeashData::checkSync);
} }
@ -308,9 +765,18 @@ public final class LeashDataInnerAPI {
// ==================== 工具方法 ==================== // ==================== 工具方法 ====================
/**
* The type Utils.
*/
public static final class Utils { public static final class Utils {
private Utils() {} private Utils() {}
/**
* Has leash data boolean.
*
* @param entity the entity
* @return the boolean
*/
public static boolean hasLeashData(Entity entity) { public static boolean hasLeashData(Entity entity) {
return getLeashData(entity).isPresent(); return getLeashData(entity).isPresent();
} }

View File

@ -28,6 +28,9 @@ import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
/**
* The type Leash state inner api.
*/
@SuppressWarnings("unused") @SuppressWarnings("unused")
@ApiStatus.Internal @ApiStatus.Internal
public final class LeashStateInnerAPI { public final class LeashStateInnerAPI {
@ -35,6 +38,12 @@ public final class LeashStateInnerAPI {
private LeashStateInnerAPI() { private LeashStateInnerAPI() {
} // 防止实例化 } // 防止实例化
/**
* Gets leash state.
*
* @param entity the entity
* @return the leash state
*/
public static @NotNull Optional<ILeashState> getLeashState(@NotNull Entity entity) { public static @NotNull Optional<ILeashState> getLeashState(@NotNull Entity entity) {
Objects.requireNonNull(entity, "Entity cannot be null"); Objects.requireNonNull(entity, "Entity cannot be null");
return entity.getCapability(SLPCapability.LEASH_STATE_CAP).resolve(); return entity.getCapability(SLPCapability.LEASH_STATE_CAP).resolve();
@ -42,49 +51,119 @@ public final class LeashStateInnerAPI {
// ==================== 查询操作 ==================== // ==================== 查询操作 ====================
/**
* The type Query.
*/
public static final class Query { public static final class Query {
private Query() { private Query() {
} }
/**
* Has leash state boolean.
*
* @param entity the entity
* @return the boolean
*/
public static boolean hasLeashState(Entity entity) { public static boolean hasLeashState(Entity entity) {
return getLeashState(entity).map(ILeashState::hasLeashState).orElse(false); return getLeashState(entity).map(ILeashState::hasLeashState).orElse(false);
} }
/**
* Gets all uuid states.
*
* @param entity the entity
* @return the all uuid states
*/
public static Map<UUID, ILeashState.LeashState> getAllUUIDStates(Entity entity) { public static Map<UUID, ILeashState.LeashState> getAllUUIDStates(Entity entity) {
return getLeashState(entity) return getLeashState(entity)
.map(ILeashState::getHolderLeashStates) .map(ILeashState::getHolderLeashStates)
.orElse(Map.of()); .orElse(Map.of());
} }
/**
* Gets all block pos states.
*
* @param entity the entity
* @return the all block pos states
*/
public static Map<BlockPos, ILeashState.LeashState> getAllBlockPosStates(Entity entity) { public static Map<BlockPos, ILeashState.LeashState> getAllBlockPosStates(Entity entity) {
return getLeashState(entity) return getLeashState(entity)
.map(ILeashState::getKnotLeashStates) .map(ILeashState::getKnotLeashStates)
.orElse(Map.of()); .orElse(Map.of());
} }
/**
* Gets state.
*
* @param entity the entity
* @param holder the holder
* @return the state
*/
public static Optional<ILeashState.LeashState> getState(Entity entity, Entity holder) { public static Optional<ILeashState.LeashState> getState(Entity entity, Entity holder) {
return getLeashState(entity).flatMap(state -> state.getLeashState(holder)); return getLeashState(entity).flatMap(state -> state.getLeashState(holder));
} }
/**
* Gets state.
*
* @param entity the entity
* @param holderUUID the holder uuid
* @return the state
*/
public static Optional<ILeashState.LeashState> getState(Entity entity, UUID holderUUID) { public static Optional<ILeashState.LeashState> getState(Entity entity, UUID holderUUID) {
return getLeashState(entity).flatMap(state -> state.getLeashState(holderUUID)); return getLeashState(entity).flatMap(state -> state.getLeashState(holderUUID));
} }
/**
* Gets state.
*
* @param entity the entity
* @param knotPos the knot pos
* @return the state
*/
public static Optional<ILeashState.LeashState> getState(Entity entity, BlockPos knotPos) { public static Optional<ILeashState.LeashState> getState(Entity entity, BlockPos knotPos) {
return getLeashState(entity).flatMap(state -> state.getLeashState(knotPos)); return getLeashState(entity).flatMap(state -> state.getLeashState(knotPos));
} }
/**
* Has state boolean.
*
* @param entity the entity
* @return the boolean
*/
public static boolean hasState(Entity entity) { public static boolean hasState(Entity entity) {
return getLeashState(entity).isPresent(); return getLeashState(entity).isPresent();
} }
/**
* Has state for boolean.
*
* @param entity the entity
* @param holder the holder
* @return the boolean
*/
public static boolean hasStateFor(Entity entity, Entity holder) { public static boolean hasStateFor(Entity entity, Entity holder) {
return getState(entity, holder).isPresent(); return getState(entity, holder).isPresent();
} }
/**
* Has state for boolean.
*
* @param entity the entity
* @param holderUUID the holder uuid
* @return the boolean
*/
public static boolean hasStateFor(Entity entity, UUID holderUUID) { public static boolean hasStateFor(Entity entity, UUID holderUUID) {
return getState(entity, holderUUID).isPresent(); return getState(entity, holderUUID).isPresent();
} }
/**
* Has state for boolean.
*
* @param entity the entity
* @param knotPos the knot pos
* @return the boolean
*/
public static boolean hasStateFor(Entity entity, BlockPos knotPos) { public static boolean hasStateFor(Entity entity, BlockPos knotPos) {
return getState(entity, knotPos).isPresent(); return getState(entity, knotPos).isPresent();
} }
@ -92,110 +171,265 @@ public final class LeashStateInnerAPI {
// ==================== 偏移量操作 ==================== // ==================== 偏移量操作 ====================
/**
* The type Offset.
*/
public static final class Offset { public static final class Offset {
private Offset() { private Offset() {
} }
// ---------------------- 重置操作 ---------------------- /**
* Reset all holder.
*
* @param entity the entity
*/
// ---------------------- 重置操作 ----------------------
public static void resetAllHolder(Entity entity) { public static void resetAllHolder(Entity entity) {
getLeashState(entity).ifPresent(ILeashState::resetAllLeashHolderLocationsOffset); getLeashState(entity).ifPresent(ILeashState::resetAllLeashHolderLocationsOffset);
} }
/**
* Reset holder for.
*
* @param entity the entity
* @param holder the holder
*/
public static void resetHolderFor(Entity entity, Entity holder) { public static void resetHolderFor(Entity entity, Entity holder) {
getLeashState(entity).ifPresent(state -> state.resetLeashHolderLocationOffset(holder)); getLeashState(entity).ifPresent(state -> state.resetLeashHolderLocationOffset(holder));
} }
/**
* Reset holder for.
*
* @param entity the entity
* @param holderUUID the holder uuid
*/
public static void resetHolderFor(Entity entity, UUID holderUUID) { public static void resetHolderFor(Entity entity, UUID holderUUID) {
getLeashState(entity).ifPresent(state -> state.resetLeashHolderLocationOffset(holderUUID)); getLeashState(entity).ifPresent(state -> state.resetLeashHolderLocationOffset(holderUUID));
} }
/**
* Reset holder for.
*
* @param entity the entity
* @param knotPos the knot pos
*/
public static void resetHolderFor(Entity entity, BlockPos knotPos) { public static void resetHolderFor(Entity entity, BlockPos knotPos) {
getLeashState(entity).ifPresent(state -> state.resetLeashHolderLocationOffset(knotPos)); getLeashState(entity).ifPresent(state -> state.resetLeashHolderLocationOffset(knotPos));
} }
// ---------------------- 设置操作 ---------------------- /**
* Sets holder for.
*
* @param entity the entity
* @param holder the holder
* @param offset the offset
*/
// ---------------------- 设置操作 ----------------------
public static void setHolderFor(Entity entity, Entity holder, Vec3 offset) { public static void setHolderFor(Entity entity, Entity holder, Vec3 offset) {
getLeashState(entity).ifPresent(state -> state.setLeashHolderLocationOffset(holder, offset)); getLeashState(entity).ifPresent(state -> state.setLeashHolderLocationOffset(holder, offset));
} }
/**
* Sets holder for.
*
* @param entity the entity
* @param holderUUID the holder uuid
* @param offset the offset
*/
public static void setHolderFor(Entity entity, UUID holderUUID, Vec3 offset) { public static void setHolderFor(Entity entity, UUID holderUUID, Vec3 offset) {
getLeashState(entity).ifPresent(state -> state.setLeashHolderLocationOffset(holderUUID, offset)); getLeashState(entity).ifPresent(state -> state.setLeashHolderLocationOffset(holderUUID, offset));
} }
/**
* Sets holder for.
*
* @param entity the entity
* @param knotPos the knot pos
* @param offset the offset
*/
public static void setHolderFor(Entity entity, BlockPos knotPos, Vec3 offset) { public static void setHolderFor(Entity entity, BlockPos knotPos, Vec3 offset) {
getLeashState(entity).ifPresent(state -> state.setLeashHolderLocationOffset(knotPos, offset)); getLeashState(entity).ifPresent(state -> state.setLeashHolderLocationOffset(knotPos, offset));
} }
/**
* Sets holder for.
*
* @param entity the entity
* @param knotPos the knot pos
*/
public static void setHolderFor(Entity entity, BlockPos knotPos) { public static void setHolderFor(Entity entity, BlockPos knotPos) {
getLeashState(entity).ifPresent(state -> state.setLeashHolderLocationOffset(knotPos, null)); getLeashState(entity).ifPresent(state -> state.setLeashHolderLocationOffset(knotPos, null));
} }
/**
* Sets holder for.
*
* @param entity the entity
* @param holder the holder
*/
public static void setHolderFor(Entity entity, Entity holder) { public static void setHolderFor(Entity entity, Entity holder) {
getLeashState(entity).ifPresent(state -> state.setLeashHolderLocationOffset(holder, null)); getLeashState(entity).ifPresent(state -> state.setLeashHolderLocationOffset(holder, null));
} }
/**
* Sets holder for.
*
* @param entity the entity
* @param holderUUID the holder uuid
*/
public static void setHolderFor(Entity entity, UUID holderUUID) { public static void setHolderFor(Entity entity, UUID holderUUID) {
getLeashState(entity).ifPresent(state -> state.setLeashHolderLocationOffset(holderUUID, null)); getLeashState(entity).ifPresent(state -> state.setLeashHolderLocationOffset(holderUUID, null));
} }
// ---------------------- 添加操作 ---------------------- /**
* Add holder to.
*
* @param entity the entity
* @param holder the holder
* @param offset the offset
*/
// ---------------------- 添加操作 ----------------------
public static void addHolderTo(Entity entity, Entity holder, Vec3 offset) { public static void addHolderTo(Entity entity, Entity holder, Vec3 offset) {
getLeashState(entity).ifPresent(state -> state.addLeashHolderLocationOffset(holder, offset)); getLeashState(entity).ifPresent(state -> state.addLeashHolderLocationOffset(holder, offset));
} }
/**
* Add holder to.
*
* @param entity the entity
* @param holderUUID the holder uuid
* @param offset the offset
*/
public static void addHolderTo(Entity entity, UUID holderUUID, Vec3 offset) { public static void addHolderTo(Entity entity, UUID holderUUID, Vec3 offset) {
getLeashState(entity).ifPresent(state -> state.addLeashHolderLocationOffset(holderUUID, offset)); getLeashState(entity).ifPresent(state -> state.addLeashHolderLocationOffset(holderUUID, offset));
} }
/**
* Add holder to.
*
* @param entity the entity
* @param knotPos the knot pos
* @param offset the offset
*/
public static void addHolderTo(Entity entity, BlockPos knotPos, Vec3 offset) { public static void addHolderTo(Entity entity, BlockPos knotPos, Vec3 offset) {
getLeashState(entity).ifPresent(state -> state.addLeashHolderLocationOffset(knotPos, offset)); getLeashState(entity).ifPresent(state -> state.addLeashHolderLocationOffset(knotPos, offset));
} }
// ---------------------- 移除操作 ---------------------- /**
* Remove holder for.
*
* @param entity the entity
* @param holder the holder
*/
// ---------------------- 移除操作 ----------------------
public static void removeHolderFor(Entity entity, Entity holder) { public static void removeHolderFor(Entity entity, Entity holder) {
getLeashState(entity).ifPresent(state -> state.removeLeashHolderLocationOffset(holder)); getLeashState(entity).ifPresent(state -> state.removeLeashHolderLocationOffset(holder));
} }
/**
* Remove holder for.
*
* @param entity the entity
* @param holderUUID the holder uuid
*/
public static void removeHolderFor(Entity entity, UUID holderUUID) { public static void removeHolderFor(Entity entity, UUID holderUUID) {
getLeashState(entity).ifPresent(state -> state.removeLeashHolderLocationOffset(holderUUID)); getLeashState(entity).ifPresent(state -> state.removeLeashHolderLocationOffset(holderUUID));
} }
/**
* Remove holder for.
*
* @param entity the entity
* @param knotPos the knot pos
*/
public static void removeHolderFor(Entity entity, BlockPos knotPos) { public static void removeHolderFor(Entity entity, BlockPos knotPos) {
getLeashState(entity).ifPresent(state -> state.removeLeashHolderLocationOffset(knotPos)); getLeashState(entity).ifPresent(state -> state.removeLeashHolderLocationOffset(knotPos));
} }
/**
* Remove holder all.
*
* @param entity the entity
*/
public static void removeHolderAll(Entity entity) { public static void removeHolderAll(Entity entity) {
getLeashState(entity).ifPresent(ILeashState::removeAllLeashHolderLocationOffset); getLeashState(entity).ifPresent(ILeashState::removeAllLeashHolderLocationOffset);
} }
/**
* Remove all holder uui ds.
*
* @param entity the entity
*/
public static void removeAllHolderUUIDs(Entity entity) { public static void removeAllHolderUUIDs(Entity entity) {
getLeashState(entity).ifPresent(ILeashState::removeAllLeashHolderUUIDLocationOffset); getLeashState(entity).ifPresent(ILeashState::removeAllLeashHolderUUIDLocationOffset);
} }
/**
* Remove all holder block poses.
*
* @param entity the entity
*/
public static void removeAllHolderBlockPoses(Entity entity) { public static void removeAllHolderBlockPoses(Entity entity) {
getLeashState(entity).ifPresent(ILeashState::removeAllLeashHolderBlockPosLocationOffset); getLeashState(entity).ifPresent(ILeashState::removeAllLeashHolderBlockPosLocationOffset);
} }
/**
* Gets apply entity offset.
*
* @param entity the entity
* @return the apply entity offset
*/
public static Optional<Vec3> getApplyEntityOffset(Entity entity) { public static Optional<Vec3> getApplyEntityOffset(Entity entity) {
return getLeashState(entity).flatMap(ILeashState::getLeashApplyEntityLocationOffset); return getLeashState(entity).flatMap(ILeashState::getLeashApplyEntityLocationOffset);
} }
/**
* Gets default apply entity offset.
*
* @param entity the entity
* @return the default apply entity offset
*/
public static Vec3 getDefaultApplyEntityOffset(Entity entity) { public static Vec3 getDefaultApplyEntityOffset(Entity entity) {
return getLeashState(entity) return getLeashState(entity)
.map(ILeashState::getDefaultLeashApplyEntityLocationOffset) .map(ILeashState::getDefaultLeashApplyEntityLocationOffset)
.orElse(Vec3.ZERO); .orElse(Vec3.ZERO);
} }
/**
* Reset apply entity all.
*
* @param entity the entity
*/
public static void resetApplyEntityAll(Entity entity) { public static void resetApplyEntityAll(Entity entity) {
getLeashState(entity).ifPresent(ILeashState::resetAllLeashApplyEntityLocationsOffset); getLeashState(entity).ifPresent(ILeashState::resetAllLeashApplyEntityLocationsOffset);
} }
/**
* Remove apply entity.
*
* @param entity the entity
*/
public static void removeApplyEntity(Entity entity) { public static void removeApplyEntity(Entity entity) {
getLeashState(entity).ifPresent(ILeashState::removeLeashApplyEntityLocationOffset); getLeashState(entity).ifPresent(ILeashState::removeLeashApplyEntityLocationOffset);
} }
/**
* Sets apply entity.
*
* @param entity the entity
* @param offset the offset
*/
public static void setApplyEntity(Entity entity, Vec3 offset) { public static void setApplyEntity(Entity entity, Vec3 offset) {
getLeashState(entity).ifPresent(state -> state.setLeashApplyEntityLocationOffset(offset)); getLeashState(entity).ifPresent(state -> state.setLeashApplyEntityLocationOffset(offset));
} }
/**
* Add apply entity.
*
* @param entity the entity
* @param offset the offset
*/
public static void addApplyEntity(Entity entity, Vec3 offset) { public static void addApplyEntity(Entity entity, Vec3 offset) {
getLeashState(entity).ifPresent(state -> state.addLeashApplyEntityLocationOffset(offset)); getLeashState(entity).ifPresent(state -> state.addLeashApplyEntityLocationOffset(offset));
} }
@ -204,18 +438,36 @@ public final class LeashStateInnerAPI {
// ==================== 同步操作 ==================== // ==================== 同步操作 ====================
/**
* The type Sync.
*/
public static final class Sync { public static final class Sync {
private Sync() { private Sync() {
} }
/**
* Mark.
*
* @param entity the entity
*/
public static void mark(Entity entity) { public static void mark(Entity entity) {
getLeashState(entity).ifPresent(ILeashState::markForSync); getLeashState(entity).ifPresent(ILeashState::markForSync);
} }
/**
* Immediate.
*
* @param entity the entity
*/
public static void immediate(Entity entity) { public static void immediate(Entity entity) {
getLeashState(entity).ifPresent(ILeashState::immediateSync); getLeashState(entity).ifPresent(ILeashState::immediateSync);
} }
/**
* Check.
*
* @param entity the entity
*/
public static void check(Entity entity) { public static void check(Entity entity) {
getLeashState(entity).ifPresent(ILeashState::checkSync); getLeashState(entity).ifPresent(ILeashState::checkSync);
} }
@ -223,10 +475,19 @@ public final class LeashStateInnerAPI {
// ==================== 高级操作 ==================== // ==================== 高级操作 ====================
/**
* The type Operations.
*/
public static final class Operations { public static final class Operations {
private Operations() { private Operations() {
} }
/**
* Attach.
*
* @param leashed the leashed
* @param holder the holder
*/
public static void attach(Entity leashed, Entity holder) { public static void attach(Entity leashed, Entity holder) {
getLeashState(leashed).ifPresent(state -> getLeashState(leashed).ifPresent(state ->
state.setLeashHolderLocationOffset(holder, state.setLeashHolderLocationOffset(holder,
@ -234,18 +495,43 @@ public final class LeashStateInnerAPI {
); );
} }
/**
* Detach.
*
* @param leashed the leashed
* @param holder the holder
*/
public static void detach(Entity leashed, Entity holder) { public static void detach(Entity leashed, Entity holder) {
Offset.removeHolderFor(leashed, holder); Offset.removeHolderFor(leashed, holder);
} }
/**
* Detach.
*
* @param leashed the leashed
* @param holderUUID the holder uuid
*/
public static void detach(Entity leashed, UUID holderUUID) { public static void detach(Entity leashed, UUID holderUUID) {
Offset.removeHolderFor(leashed, holderUUID); Offset.removeHolderFor(leashed, holderUUID);
} }
/**
* Detach.
*
* @param leashed the leashed
* @param knotPos the knot pos
*/
public static void detach(Entity leashed, BlockPos knotPos) { public static void detach(Entity leashed, BlockPos knotPos) {
Offset.removeHolderFor(leashed, knotPos); Offset.removeHolderFor(leashed, knotPos);
} }
/**
* Transfer.
*
* @param leashed the leashed
* @param oldHolder the old holder
* @param newHolder the new holder
*/
public static void transfer(Entity leashed, Entity oldHolder, Entity newHolder) { public static void transfer(Entity leashed, Entity oldHolder, Entity newHolder) {
getLeashState(leashed).ifPresent(state -> { getLeashState(leashed).ifPresent(state -> {
state.removeLeashHolderLocationOffset(oldHolder); state.removeLeashHolderLocationOffset(oldHolder);
@ -254,6 +540,13 @@ public final class LeashStateInnerAPI {
}); });
} }
/**
* Transfer.
*
* @param leashed the leashed
* @param oldHolderUUID the old holder uuid
* @param newHolder the new holder
*/
public static void transfer(Entity leashed, UUID oldHolderUUID, Entity newHolder) { public static void transfer(Entity leashed, UUID oldHolderUUID, Entity newHolder) {
getLeashState(leashed).ifPresent(state -> { getLeashState(leashed).ifPresent(state -> {
state.removeLeashHolderLocationOffset(oldHolderUUID); state.removeLeashHolderLocationOffset(oldHolderUUID);
@ -262,6 +555,13 @@ public final class LeashStateInnerAPI {
}); });
} }
/**
* Transfer.
*
* @param leashed the leashed
* @param oldKnotPos the old knot pos
* @param newHolder the new holder
*/
public static void transfer(Entity leashed, BlockPos oldKnotPos, Entity newHolder) { public static void transfer(Entity leashed, BlockPos oldKnotPos, Entity newHolder) {
getLeashState(leashed).ifPresent(state -> { getLeashState(leashed).ifPresent(state -> {
state.removeLeashHolderLocationOffset(oldKnotPos); state.removeLeashHolderLocationOffset(oldKnotPos);
@ -270,6 +570,12 @@ public final class LeashStateInnerAPI {
}); });
} }
/**
* Copy.
*
* @param source the source
* @param target the target
*/
public static void copy(Entity source, Entity target) { public static void copy(Entity source, Entity target) {
getLeashState(source).ifPresent(sourceState -> getLeashState(source).ifPresent(sourceState ->
getLeashState(target).ifPresent(targetState -> getLeashState(target).ifPresent(targetState ->

View File

@ -25,7 +25,15 @@ import top.r3944realms.superleadrope.SuperLeadRope;
import java.io.File; import java.io.File;
import java.util.Optional; import java.util.Optional;
/**
* The type Config util.
*/
public class ConfigUtil { public class ConfigUtil {
/**
* Create file.
*
* @param children the children
*/
public static void createFile(String[] children) {//初始化配置文件目录 public static void createFile(String[] children) {//初始化配置文件目录
File configFile = new File(FMLPaths.CONFIGDIR.get().toFile(), SuperLeadRope.MOD_ID); File configFile = new File(FMLPaths.CONFIGDIR.get().toFile(), SuperLeadRope.MOD_ID);
if (!configFile.exists()) { if (!configFile.exists()) {
@ -48,6 +56,15 @@ public class ConfigUtil {
} }
} }
/**
* Register config.
*
* @param context the context
* @param type the type
* @param configSpec the config spec
* @param folderName the folder name
* @param fileName the file name
*/
public static void registerConfig ( public static void registerConfig (
@NotNull ModLoadingContext context, @NotNull ModLoadingContext context,
ModConfig.Type type, ModConfig.Type type,

View File

@ -15,12 +15,30 @@
package top.r3944realms.superleadrope.util.lang; package top.r3944realms.superleadrope.util.lang;
/**
* The enum Language enum.
*/
public enum LanguageEnum { public enum LanguageEnum {
/**
* English language enum.
*/
English("en_us"), English("en_us"),
/**
* Simple chinese language enum.
*/
SimpleChinese("zh_cn"), SimpleChinese("zh_cn"),
/**
* Traditional chinese language enum.
*/
TraditionalChinese("zh_tw"), TraditionalChinese("zh_tw"),
/**
* Literary chinese language enum.
*/
LiteraryChinese("lzh"), LiteraryChinese("lzh"),
; ;
/**
* The Local.
*/
public final String local; public final String local;
LanguageEnum(String local) { LanguageEnum(String local) {
this.local = local; this.local = local;

View File

@ -15,24 +15,81 @@
package top.r3944realms.superleadrope.util.lang; package top.r3944realms.superleadrope.util.lang;
/**
* The enum Mod part enum.
*/
public enum ModPartEnum { public enum ModPartEnum {
/**
* Default mod part enum.
*/
DEFAULT, DEFAULT,
/**
* Item mod part enum.
*/
ITEM, ITEM,
/**
* Block mod part enum.
*/
BLOCK, BLOCK,
/**
* Enchantment mod part enum.
*/
ENCHANTMENT, ENCHANTMENT,
/**
* Advancement mod part enum.
*/
ADVANCEMENT, ADVANCEMENT,
/**
* Creative tab mod part enum.
*/
CREATIVE_TAB, CREATIVE_TAB,
/**
* Config mod part enum.
*/
CONFIG, CONFIG,
/**
* Entity mod part enum.
*/
ENTITY, ENTITY,
/**
* Gui mod part enum.
*/
GUI, GUI,
/**
* Author mod part enum.
*/
AUTHOR, AUTHOR,
/**
* Title mod part enum.
*/
TITLE, TITLE,
/**
* Name mod part enum.
*/
NAME, NAME,
/**
* Game rule mod part enum.
*/
GAME_RULE, GAME_RULE,
/**
* Description mod part enum.
*/
DESCRIPTION, DESCRIPTION,
/**
* Info mod part enum.
*/
INFO, INFO,
/**
* Message mod part enum.
*/
MESSAGE, MESSAGE,
/**
* Command mod part enum.
*/
COMMAND, COMMAND,
/**
* Sound mod part enum.
*/
SOUND SOUND
} }

Some files were not shown because too many files have changed in this diff Show More