2024/11/24

修改了下+2
This commit is contained in:
叁玖领域 2024-11-24 22:09:08 +08:00
parent 8e0c06f392
commit 78c92d4e42
19 changed files with 237 additions and 76 deletions

View File

@ -1,4 +1,4 @@
# 版本 0.0.3.9.9.3 提前介绍c[最终版本对于0.0.4] 【注意:本解釋簡繁混寫,因爲趕時間,所以並不怎麽規範,請諒解】
# 版本 0.0.3.9.9.7 提前介绍c[最终版本对于0.0.4] 【注意:本解釋簡繁混寫,因爲趕時間,所以並不怎麽規範,請諒解】
## 简介
现在开始你可以用拴绳拴住玩家,也可以拴住自己了,不如尝试拴住彼此来通关我的世界吧(
@ -48,6 +48,8 @@
* `/lp tick ...` - 用法同原版Tick但权限降为2只用于调试切勿滥用后期考虑可能写成区域性的
* `/lp debug ...` - Debug指令未来可能会移除
## 游戏规则
@ -57,4 +59,8 @@
* `LP.KeepLeashNotDropTime` - 此规则决定,当拴绳关系创建时一段时间里,即是距离已经达到了断裂距离,也保持其不断裂 [默认值: 240ticks ,可设置范围[80, 1200]ticks]
* `LP.DefaultTalkArea` - 此规则决定,聊天半径最小正值 [默认值: -1]
* `LP.DefaultTalkArea` - 此规则决定,聊天半径最小正值 [默认值: -1]
* `LP.OpenTOPNeededModeWhenScreenIsNotNull` - 此规则决定,是否在在打开 屏幕{除Top的NoteGui 和 聊天GUI外} 情况下改变Top的显示模式为NEEDED [默认值: true]
* `LP.CanCommonPlayerChangeSelfTalkArea` - 此规则决定,是否普通玩家可以修改自己的聊天可见区域 [默认值: true]

View File

@ -35,7 +35,7 @@ mod_name=Leashed Player
# The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default.
mod_license=MIT
# The mod version. See https://semver.org/
mod_version=0.0.3.9.9.3
mod_version=0.0.3.9.9.7
# The group ID for the mod. It is only important when publishing as an artifact to a Maven repository.
# This should match the base package used for the mod sources.
# See https://maven.apache.org/guides/mini/guide-naming-conventions.html

View File

@ -1,2 +1,2 @@
// 1.21 2024-11-24T18:33:50.0269287 Languages: en_us for mod: leashedplayer
a71b7d357b5cd2711e5d59a1784c7c60d8548c43 assets/leashedplayer/lang/en_us.json
// 1.21 2024-11-24T21:20:56.9104455 Languages: en_us for mod: leashedplayer
15a68b539dc9bfec4a0c802a501ee207a84a5a7f assets/leashedplayer/lang/en_us.json

View File

@ -1,2 +1,2 @@
// 1.21 2024-11-24T18:33:50.0259301 Languages: zh_cn for mod: leashedplayer
81b6af6b88539aaf86f0942573198ead6098478a assets/leashedplayer/lang/zh_cn.json
// 1.21 2024-11-24T21:20:56.9094392 Languages: zh_cn for mod: leashedplayer
5231f5c20d6bf6d646c8bb8cf28a7d3caf82073b assets/leashedplayer/lang/zh_cn.json

View File

@ -1,2 +1,2 @@
// 1.21 2024-11-24T18:33:50.0239354 Languages: zh_tw for mod: leashedplayer
232af0a8d220b865292cabcc3b5afc0164520116 assets/leashedplayer/lang/zh_tw.json
// 1.21 2024-11-24T21:20:56.907444 Languages: zh_tw for mod: leashedplayer
c99a4f7dd93ced0df1f2689852879858297d3f60 assets/leashedplayer/lang/zh_tw.json

View File

@ -26,6 +26,8 @@
"entity.leashedplayer.kid_player": "Kid",
"entity.leashedplayer.leash_rope_arrow": "Leash Rope Arrow",
"entity.leashedplayer.spectral_leash_rope_arrow": "Spectral Leash Rope Arrow",
"gamerule.LP.CanCommonPlayerChangeSelfTalkArea": "Should Non-OP Player can change their TalkArea",
"gamerule.LP.CanCommonPlayerChangeSelfTalkArea.description": "Above on its Name",
"gamerule.LP.CreateLeashFenceKnotEntityIfAbsent": "Create Leash Fence Knot Entity if absent",
"gamerule.LP.CreateLeashFenceKnotEntityIfAbsent.description": "Create LeashKnot Entity if it's absent on fence",
"gamerule.LP.DefaultTalkArea": "Default Area Talk",
@ -58,7 +60,10 @@
"item.variant.leash_rope_arrow.desc.1": "§7A variant of Leash Rope Arrow",
"item.variant.leash_rope_arrow.desc.2": "§c1.§r The function is the same as its original one。",
"jukebox_song.leashedplayer.what_does_the_fox_say": "What does the fox say?",
"key.leashedplayer.apply_talkarea_preference": "Apply TalkArea Preference",
"key.leashedplayer.category": "Leashed Player",
"leashedplayer.chat.none_heard_you": "Nobody heard your message",
"leashedplayer.command.chat.message.no_right": "You haven't the right to do that!",
"leashedplayer.command.chat.message.talkarea.current_config": "%s 's §6TalkArea Current§7:§e %d §6blocks §f(§aPrefence§7:§e %d §ablocks§f)§r",
"leashedplayer.command.chat.message.talkarea.preference.set": "%s 's §atalk area preference set to §e%d§a blocks!§r",
"leashedplayer.command.chat.message.talkarea.preference_not_set": "%s 's talk area preference is not set!",

View File

@ -26,6 +26,8 @@
"entity.leashedplayer.kid_player": "小孩",
"entity.leashedplayer.leash_rope_arrow": "拴绳箭",
"entity.leashedplayer.spectral_leash_rope_arrow": "拴绳光灵箭",
"gamerule.LP.CanCommonPlayerChangeSelfTalkArea": "非OP应该可以修改自己的聊天可见半径吗?",
"gamerule.LP.CanCommonPlayerChangeSelfTalkArea.description": "同名",
"gamerule.LP.CreateLeashFenceKnotEntityIfAbsent": "如果缺失则创建拴绳结",
"gamerule.LP.CreateLeashFenceKnotEntityIfAbsent.description": "如果在栅栏处缺失拴绳结,则创建它",
"gamerule.LP.DefaultTalkArea": "默认聊天区域可见半径",
@ -58,7 +60,10 @@
"item.variant.leash_rope_arrow.desc.1": "§7拴绳箭的一个变种",
"item.variant.leash_rope_arrow.desc.2": "§c1.§r 功能同其本体;",
"jukebox_song.leashedplayer.what_does_the_fox_say": "狐狸是怎么叫的?",
"key.leashedplayer.apply_talkarea_preference": "应用可见区域预设",
"key.leashedplayer.category": "可拴玩家",
"leashedplayer.chat.none_heard_you": "沒有人接收到你的消息",
"leashedplayer.command.chat.message.no_right": "你无权这样做!",
"leashedplayer.command.chat.message.talkarea.current_config": "%s§6目前聊天区域可见半径设置§7:§e %d §6格 §f(§a默认值§7:§e %d §a格§f)§r",
"leashedplayer.command.chat.message.talkarea.preference.set": "%s§a默认聊天区域可见消息半径设置为 §e%d §a格!§r",
"leashedplayer.command.chat.message.talkarea.preference_not_set": "%s未设置默认可见消息聊天区域半径",

View File

@ -26,6 +26,8 @@
"entity.leashedplayer.kid_player": "小孩",
"entity.leashedplayer.leash_rope_arrow": "拴繩箭",
"entity.leashedplayer.spectral_leash_rope_arrow": "拴繩光靈箭",
"gamerule.LP.CanCommonPlayerChangeSelfTalkArea": "非OP應該可以修改自己的聊天可見半徑嗎",
"gamerule.LP.CanCommonPlayerChangeSelfTalkArea.description": "同名",
"gamerule.LP.CreateLeashFenceKnotEntityIfAbsent": "如果缺失則創建拴繩結",
"gamerule.LP.CreateLeashFenceKnotEntityIfAbsent.description": "如果在柵欄処缺失拴繩結,則創建它",
"gamerule.LP.DefaultTalkArea": "默認聊天區域可見半徑",
@ -58,7 +60,10 @@
"item.variant.leash_rope_arrow.desc.1": "§7拴繩箭矢的一個變種",
"item.variant.leash_rope_arrow.desc.2": "§c1.§r 功能與本體一致;",
"jukebox_song.leashedplayer.what_does_the_fox_say": "狐狸是怎麽叫的?",
"key.leashedplayer.apply_talkarea_preference": "應用設置可見區域預設",
"key.leashedplayer.category": "可拴玩家",
"leashedplayer.chat.none_heard_you": "無人接收到你的訊息",
"leashedplayer.command.chat.message.no_right": "你無權這麽做!",
"leashedplayer.command.chat.message.talkarea.current_config": "%s§6目前可見訊息聊天半徑設置§7:§e%d §6格 §f(§a默認值§7:§e%d §a格§f)§r",
"leashedplayer.command.chat.message.talkarea.preference.set": "%s§a默認聊天區域可見訊息半徑設置為 §e%d §a格!§r",
"leashedplayer.command.chat.message.talkarea.preference_not_set": "%s未設置可見訊息聊天半徑",

View File

@ -4,6 +4,8 @@ import com.r3944realms.leashedplayer.client.renders.entities.ChestItemLayerRende
import com.r3944realms.leashedplayer.client.renders.entities.KidPlayerRenderer;
import com.r3944realms.leashedplayer.client.renders.entities.LeashRopeArrowRenderer;
import com.r3944realms.leashedplayer.client.renders.entities.SpectralLeashRopeArrowRenderer;
import com.r3944realms.leashedplayer.content.ModKeyMapping;
import com.r3944realms.leashedplayer.content.commands.Command;
import com.r3944realms.leashedplayer.content.entities.ModEntityRegister;
import com.r3944realms.leashedplayer.content.gamerules.GameruleRegistry;
import com.r3944realms.leashedplayer.content.gamerules.Server.OpenTOPNeededModeWhenScreenIsNotNull;
@ -34,10 +36,7 @@ import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.ModList;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent;
import net.neoforged.neoforge.client.event.ClientTickEvent;
import net.neoforged.neoforge.client.event.EntityRenderersEvent;
import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent;
import net.neoforged.neoforge.client.event.ScreenEvent;
import net.neoforged.neoforge.client.event.*;
import java.util.Objects;
import java.util.Stack;
@ -85,55 +84,68 @@ public abstract class ClientEventHandler {
}
}
}
@SubscribeEvent
public static void onKetBoardInput(InputEvent.Key event) {
if(ModKeyMapping.KEY_APPLY_TALKAREA_PREFERENCE.isDown()) {
assert Minecraft.getInstance().player != null;
String prefix = (Command.SHOULD_USE_PREFIX ? Command.PREFIX : "") + " ";
Minecraft.getInstance().player.connection.sendCommand(prefix + "talkArea usePreference");
}
}
}
@EventBusSubscriber(value = Dist.CLIENT, bus = EventBusSubscriber.Bus.MOD, modid = LeashedPlayer.MOD_ID)
public static class Mod extends ClientEventHandler {
@SubscribeEvent
public static void onRegisterItemProperties (FMLClientSetupEvent event){
event.enqueueWork(() -> {
ItemProperties.register(Items.CROSSBOW, ResourceLocation.withDefaultNamespace("leash_rope_arrow"),
((pStack, pLevel, pEntity, pSeed) -> {
ChargedProjectiles chargedProjectiles = pStack.get(DataComponents.CHARGED_PROJECTILES);
return chargedProjectiles != null && (chargedProjectiles.contains(ModItemRegister.LEASH_ROPE_ARROW.get()) || chargedProjectiles.contains(ModItemRegister.SPECTRAL_LEASH_ROPE_ARROW.get())) ? 1.0F : 0.0F;
}));
ItemProperties.register(Items.BOW, ResourceLocation.withDefaultNamespace("leash_rope_arrow_pulling"),
((pStack, pLevel, pEntity, pSeed) ->
(pEntity != null && pEntity.isUsingItem() && pEntity.getUseItem() == pStack && ILeashRopeArrow.isLeashRopeArrow(pStack, pEntity)) ? 1.0F : 0.0F
));
});
event.enqueueWork(() -> {
ItemProperties.register(Items.CROSSBOW, ResourceLocation.withDefaultNamespace("leash_rope_arrow"),
((pStack, pLevel, pEntity, pSeed) -> {
ChargedProjectiles chargedProjectiles = pStack.get(DataComponents.CHARGED_PROJECTILES);
return chargedProjectiles != null && (chargedProjectiles.contains(ModItemRegister.LEASH_ROPE_ARROW.get()) || chargedProjectiles.contains(ModItemRegister.SPECTRAL_LEASH_ROPE_ARROW.get())) ? 1.0F : 0.0F;
}));
ItemProperties.register(Items.BOW, ResourceLocation.withDefaultNamespace("leash_rope_arrow_pulling"),
((pStack, pLevel, pEntity, pSeed) ->
(pEntity != null && pEntity.isUsingItem() && pEntity.getUseItem() == pStack && ILeashRopeArrow.isLeashRopeArrow(pStack, pEntity)) ? 1.0F : 0.0F
));
});
}
}
@SubscribeEvent
public static void registerKeyMapping(RegisterKeyMappingsEvent event) {
event.register(ModKeyMapping.KEY_APPLY_TALKAREA_PREFERENCE);
}
@SubscribeEvent
public static void onRegisterRenderer (EntityRenderersEvent.RegisterRenderers event){
event.registerEntityRenderer(ModEntityRegister.LEASH_ROPE_ARROW.get(), LeashRopeArrowRenderer::new);
event.registerEntityRenderer(ModEntityRegister.SPECTRAL_LEASH_ROPE_ARROW.get(), SpectralLeashRopeArrowRenderer::new);
event.registerEntityRenderer(ModEntityRegister.KID.get(), KidPlayerRenderer::create);
}
event.registerEntityRenderer(ModEntityRegister.LEASH_ROPE_ARROW.get(), LeashRopeArrowRenderer::new);
event.registerEntityRenderer(ModEntityRegister.SPECTRAL_LEASH_ROPE_ARROW.get(), SpectralLeashRopeArrowRenderer::new);
event.registerEntityRenderer(ModEntityRegister.KID.get(), KidPlayerRenderer::create);
}
@SubscribeEvent
public static void onAddLayers (EntityRenderersEvent.AddLayers event){
PlayerRenderer renderer = event.getSkin(PlayerSkin.Model.WIDE);
if (renderer instanceof PlayerRenderer playerRenderer) {
playerRenderer.addLayer(new ChestItemLayerRenderer<>(playerRenderer, event.getContext().getItemInHandRenderer()));
}
PlayerRenderer renderer = event.getSkin(PlayerSkin.Model.WIDE);
if (renderer instanceof PlayerRenderer playerRenderer) {
playerRenderer.addLayer(new ChestItemLayerRenderer<>(playerRenderer, event.getContext().getItemInHandRenderer()));
}
PlayerRenderer slimRenderer = event.getSkin(PlayerSkin.Model.SLIM);
if (slimRenderer instanceof PlayerRenderer slimPlayerRenderer) {
slimPlayerRenderer.addLayer(new ChestItemLayerRenderer<>(slimPlayerRenderer, event.getContext().getItemInHandRenderer()));
PlayerRenderer slimRenderer = event.getSkin(PlayerSkin.Model.SLIM);
if (slimRenderer instanceof PlayerRenderer slimPlayerRenderer) {
slimPlayerRenderer.addLayer(new ChestItemLayerRenderer<>(slimPlayerRenderer, event.getContext().getItemInHandRenderer()));
}
}
}
@SubscribeEvent
public static void onRegisterItemColorHandlers (RegisterColorHandlersEvent.Item event){
event.register(
(color, i) -> i > 0
? -1
: FastColor.ARGB32.opaque(color.getOrDefault(DataComponents.POTION_CONTENTS, PotionContents.EMPTY).getColor()),
ModItemRegister.TIPPED_LEASH_ROPE_ARROW.get()
);
}
event.register(
(color, i) -> i > 0
? -1
: FastColor.ARGB32.opaque(color.getOrDefault(DataComponents.POTION_CONTENTS, PotionContents.EMPTY).getColor()),
ModItemRegister.TIPPED_LEASH_ROPE_ARROW.get()
);
}
}
}

View File

@ -1,10 +1,7 @@
package com.r3944realms.leashedplayer;
import com.mojang.brigadier.CommandDispatcher;
import com.r3944realms.leashedplayer.content.commands.ChatCommand;
import com.r3944realms.leashedplayer.content.commands.LeashCommand;
import com.r3944realms.leashedplayer.content.commands.MotionCommand;
import com.r3944realms.leashedplayer.content.commands.TickCommand;
import com.r3944realms.leashedplayer.content.commands.*;
import com.r3944realms.leashedplayer.content.effects.ModEffectRegister;
import com.r3944realms.leashedplayer.content.effects.ModPotionRegister;
import com.r3944realms.leashedplayer.content.entities.LeashRopeArrow;
@ -64,6 +61,7 @@ public class CommonEventHandler {
MotionCommand.register(dispatcher);
ChatCommand.register(dispatcher);
TickCommand.register(dispatcher);
DebugCommand.register(dispatcher);
}
@SubscribeEvent

View File

@ -0,0 +1,22 @@
package com.r3944realms.leashedplayer.content;
import com.mojang.blaze3d.platform.InputConstants;
import net.minecraft.client.KeyMapping;
import net.neoforged.neoforge.client.settings.KeyConflictContext;
import net.neoforged.neoforge.client.settings.KeyModifier;
import org.lwjgl.glfw.GLFW;
public class ModKeyMapping {
static String KEY_ROOT_ = "key.leashedplayer.";
public static String CATEGORY = "key.leashedplayer.category";
public static String APPLY_TALKAREA_PREFERENCE_KEY = KEY_ROOT_ + "apply_talkarea_preference";
public static final KeyMapping KEY_APPLY_TALKAREA_PREFERENCE =
new KeyMapping(
APPLY_TALKAREA_PREFERENCE_KEY,
KeyConflictContext.IN_GAME,
KeyModifier.NONE,
InputConstants.Type.KEYSYM,
GLFW.GLFW_KEY_I,
CATEGORY
);
}

View File

@ -4,7 +4,8 @@ import com.mojang.brigadier.Command;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.arguments.IntegerArgumentType;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.r3944realms.leashedplayer.config.LeashPlayerCommonConfig;
import com.r3944realms.leashedplayer.content.gamerules.GameruleRegistry;
import com.r3944realms.leashedplayer.content.gamerules.Server.CanCommonPlayerChangeSelfTalkArea;
import com.r3944realms.leashedplayer.modInterface.ServerPlayerCapacity;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
@ -18,10 +19,12 @@ import java.util.Collection;
import java.util.List;
import static com.r3944realms.leashedplayer.content.commands.Command.getLiterArgumentBuilderOfCSS;
import static com.r3944realms.leashedplayer.content.commands.Command.SHOULD_USE_PREFIX;
public class ChatCommand {
private static final String LP_CHAT_MESSAGE_ = "leashedplayer.command.chat.message.";
public static final String NO_RIGHT = LP_CHAT_MESSAGE_ + "no_right";
public static final String SELF_TALK_AREA_SET = LP_CHAT_MESSAGE_ + "talkarea.self.set",
SELF_TALK_AREA_PREFERENCE_SET = LP_CHAT_MESSAGE_ + "talkarea.self.preference.set",
SELF_TALK_AREA_PREFERENCE_NOT_SET = LP_CHAT_MESSAGE_ + "talkarea.self.preference_not_set",
@ -33,13 +36,17 @@ public class ChatCommand {
TALK_AREA_UNLIMITED = LP_CHAT_MESSAGE_ + "talkarea.unlimited",
TALK_AREA_CURRENT_CONFIG = LP_CHAT_MESSAGE_ + "talkarea.current_config";
public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {
boolean shouldUsePrefix = LeashPlayerCommonConfig.EnableLeashPlayerCommandPrefix.get();
@Nullable List<LiteralArgumentBuilder<CommandSourceStack>> nodeList = shouldUsePrefix ? null : new ArrayList<>();
@Nullable List<LiteralArgumentBuilder<CommandSourceStack>> nodeList = SHOULD_USE_PREFIX ? null : new ArrayList<>();
LiteralArgumentBuilder<CommandSourceStack> literalArgumentBuilder = Commands.literal(com.r3944realms.leashedplayer.content.commands.Command.PREFIX);
LiteralArgumentBuilder<CommandSourceStack> $$leashRoot = getLiterArgumentBuilderOfCSS("talkArea", !shouldUsePrefix, nodeList);
LiteralArgumentBuilder<CommandSourceStack> $$leashRoot = getLiterArgumentBuilderOfCSS("talkArea", !SHOULD_USE_PREFIX, nodeList);
Command<CommandSourceStack> chat$self$talkArea_set = (context -> {
CommandSourceStack source = context.getSource();
ServerPlayerCapacity serverPlayer = (ServerPlayerCapacity) source.getPlayerOrException();
ServerPlayer player = source.getPlayerOrException();
ServerPlayerCapacity serverPlayer = (ServerPlayerCapacity) player;
if((!player.hasPermissions(2) && !GameruleRegistry.getGameruleBoolValue(source.getLevel(), CanCommonPlayerChangeSelfTalkArea.ID))) {
source.sendFailure(Component.translatable(NO_RIGHT));
return 1;
}
int integer = IntegerArgumentType.getInteger(context, "talkAreaRadius");
serverPlayer.setTalkArea(integer);
source.sendSuccess(() -> Component.translatable(SELF_TALK_AREA_SET, integer),true);
@ -47,7 +54,12 @@ public class ChatCommand {
});
Command<CommandSourceStack> chat$self$talkArea_preference_set = (context -> {
CommandSourceStack source = context.getSource();
ServerPlayerCapacity serverPlayer = (ServerPlayerCapacity) source.getPlayerOrException();
ServerPlayer player = source.getPlayerOrException();
ServerPlayerCapacity serverPlayer = (ServerPlayerCapacity) player;
if((!player.hasPermissions(2) && !GameruleRegistry.getGameruleBoolValue(source.getLevel(), CanCommonPlayerChangeSelfTalkArea.ID))) {
source.sendFailure(Component.translatable(NO_RIGHT));
return 1;
}
int integer = IntegerArgumentType.getInteger(context, "talkAreaPreferenceRadius");
serverPlayer.setTalkAreaPreference(integer);
source.sendSuccess(() -> Component.translatable(SELF_TALK_AREA_PREFERENCE_SET, integer),true);
@ -55,7 +67,12 @@ public class ChatCommand {
});
Command<CommandSourceStack> chat$self$talkArea_usePreference = (context -> {
CommandSourceStack source = context.getSource();
ServerPlayerCapacity serverPlayer = (ServerPlayerCapacity) source.getPlayerOrException();
ServerPlayer player = source.getPlayerOrException();
ServerPlayerCapacity serverPlayer = (ServerPlayerCapacity) player;
if((!player.hasPermissions(2) && !GameruleRegistry.getGameruleBoolValue(source.getLevel(), CanCommonPlayerChangeSelfTalkArea.ID))) {
source.sendFailure(Component.translatable(NO_RIGHT));
return 1;
}
if(serverPlayer.getTalkAreaPreference() == -1) {
source.sendFailure(Component.translatable(SELF_TALK_AREA_PREFERENCE_NOT_SET));
return 1;
@ -67,8 +84,11 @@ public class ChatCommand {
});
Command<CommandSourceStack> chat$self$talkArea_unlimited = (context -> {
CommandSourceStack source = context.getSource();
ServerPlayerCapacity serverPlayer = (ServerPlayerCapacity) source.getPlayerOrException();
serverPlayer.setTalkArea(-1);
ServerPlayer player = source.getPlayerOrException();
if((!player.hasPermissions(2) && !GameruleRegistry.getGameruleBoolValue(source.getLevel(), CanCommonPlayerChangeSelfTalkArea.ID))) {
source.sendFailure(Component.translatable(NO_RIGHT));
return 1;
}
source.sendSuccess(() -> Component.translatable(SELF_TALK_AREA_UNLIMITED),true);
return 0;
});
@ -153,7 +173,7 @@ public class ChatCommand {
.executes(chat$talkArea_unlimited))
.then(Commands.literal("currentConfig")
.executes(chat$talkArea_getCurrentConfig)));
if(shouldUsePrefix) {
if(SHOULD_USE_PREFIX) {
literalArgumentBuilder.then(selfTalkAreaSet);
literalArgumentBuilder.then(TalkAreaCommon);
dispatcher.register(literalArgumentBuilder);

View File

@ -10,7 +10,7 @@ import java.util.List;
public class Command {
public static final String PREFIX = LeashPlayerCommonConfig.LeashedPlayerModCommandPrefix.get();
public static boolean SHOULD_USE_PREFIX = LeashPlayerCommonConfig.EnableLeashPlayerCommandPrefix.get();
static LiteralArgumentBuilder<CommandSourceStack> getLiterArgumentBuilderOfCSS(String name, boolean shouldAddToList, @Nullable List<LiteralArgumentBuilder<CommandSourceStack>> list) {
LiteralArgumentBuilder<CommandSourceStack> literal = Commands.literal(name);
if (shouldAddToList) {

View File

@ -0,0 +1,58 @@
package com.r3944realms.leashedplayer.content.commands;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
import net.minecraft.commands.arguments.EntityArgument;
import net.minecraft.network.Connection;
import net.minecraft.network.PacketSendListener;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.network.protocol.common.ClientboundDisconnectPacket;
import net.minecraft.server.level.ServerPlayer;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
import static com.r3944realms.leashedplayer.content.commands.Command.getLiterArgumentBuilderOfCSS;
import static com.r3944realms.leashedplayer.content.commands.Command.SHOULD_USE_PREFIX;
public class DebugCommand {
public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {
@Nullable List<LiteralArgumentBuilder<CommandSourceStack>> nodeList = SHOULD_USE_PREFIX ? null : new ArrayList<>();
LiteralArgumentBuilder<CommandSourceStack> literalArgumentBuilder = Commands.literal(com.r3944realms.leashedplayer.content.commands.Command.PREFIX);
LiteralArgumentBuilder<CommandSourceStack> $$DebugRoot = getLiterArgumentBuilderOfCSS("debug", !SHOULD_USE_PREFIX, nodeList);
com.mojang.brigadier.Command<CommandSourceStack> kickTargets = context -> {
for(ServerPlayer entity : EntityArgument.getPlayers(context, "targets")){
MutableComponent literal = Component.literal("You are already connected to this proxy!");
Connection connection = entity.connection.getConnection();
connection.send(new ClientboundDisconnectPacket(literal), PacketSendListener.thenRun(() -> connection.disconnect(literal)));
}
return 0;
};
com.mojang.brigadier.Command<CommandSourceStack> kickSelf = context -> {
CommandSourceStack source = context.getSource();
if (source.getEntity() instanceof ServerPlayer serverPlayer) {
MutableComponent literal = Component.literal("You are already connected to this proxy!");
Connection connection = serverPlayer.connection.getConnection();
connection.send(new ClientboundDisconnectPacket(literal), PacketSendListener.thenRun(() -> connection.disconnect(literal)));
}
return 0;
};
LiteralArgumentBuilder<CommandSourceStack> debugKick = $$DebugRoot.requires(commandSourceStack -> commandSourceStack.hasPermission(2))
.then(
Commands.literal("kick").executes(kickSelf)
.then(Commands.argument("targets", EntityArgument.entities())
.executes(kickTargets)
)
);
if(SHOULD_USE_PREFIX){
literalArgumentBuilder.then(debugKick);
dispatcher.register(literalArgumentBuilder);
} else {
nodeList.forEach(dispatcher::register);
}
}
}

View File

@ -29,6 +29,7 @@ import java.util.Collection;
import java.util.List;
import static com.r3944realms.leashedplayer.content.commands.Command.getLiterArgumentBuilderOfCSS;
import static com.r3944realms.leashedplayer.content.commands.Command.SHOULD_USE_PREFIX;
public class LeashCommand {
public static final Integer MIN_VALUE = LeashPlayerCommonConfig.MinimumLeashLengthCanBeSet.get();
@ -54,10 +55,9 @@ public class LeashCommand {
;
public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {
boolean shouldUsePrefix = LeashPlayerCommonConfig.EnableLeashPlayerCommandPrefix.get();
@Nullable List<LiteralArgumentBuilder<CommandSourceStack>> nodeList = shouldUsePrefix ? null : new ArrayList<>();
@Nullable List<LiteralArgumentBuilder<CommandSourceStack>> nodeList = SHOULD_USE_PREFIX ? null : new ArrayList<>();
LiteralArgumentBuilder<CommandSourceStack> literalArgumentBuilder = Commands.literal(com.r3944realms.leashedplayer.content.commands.Command.PREFIX);
LiteralArgumentBuilder<CommandSourceStack> $$leashRoot = getLiterArgumentBuilderOfCSS("leash", !shouldUsePrefix, nodeList);
LiteralArgumentBuilder<CommandSourceStack> $$leashRoot = getLiterArgumentBuilderOfCSS("leash", !SHOULD_USE_PREFIX, nodeList);
Command<CommandSourceStack> getSelfLeashLength = context -> {
CommandSourceStack source = context.getSource();
@ -393,7 +393,7 @@ public class LeashCommand {
)
);
if(shouldUsePrefix) {
if(SHOULD_USE_PREFIX) {
literalArgumentBuilder
.then(RefPlayerLeashLength)
.then(SelfLeashLength)

View File

@ -4,7 +4,6 @@ import com.mojang.brigadier.Command;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.arguments.DoubleArgumentType;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.r3944realms.leashedplayer.config.LeashPlayerCommonConfig;
import com.r3944realms.leashedplayer.network.client.UpdatePlayerMovement;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
@ -20,6 +19,7 @@ import java.util.ArrayList;
import java.util.List;
import static com.r3944realms.leashedplayer.content.commands.Command.getLiterArgumentBuilderOfCSS;
import static com.r3944realms.leashedplayer.content.commands.Command.SHOULD_USE_PREFIX;
public class MotionCommand {
private final static String LEASHED_PLAYER_MOTION_MESSAGE_ = "leashedplayer.command.motion.message.";
@ -27,10 +27,9 @@ public class MotionCommand {
MOTION_ADDER_SUCCESSFUL = LEASHED_PLAYER_MOTION_MESSAGE_ + "adder.successful",
MOTION_MULTIPLY_SUCCESSFUL = LEASHED_PLAYER_MOTION_MESSAGE_ + "multiply.successful";
public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {
boolean shouldUsePrefix = LeashPlayerCommonConfig.EnableLeashPlayerCommandPrefix.get();
@Nullable List<LiteralArgumentBuilder<CommandSourceStack>> nodeList = shouldUsePrefix ? null : new ArrayList<>();
@Nullable List<LiteralArgumentBuilder<CommandSourceStack>> nodeList = SHOULD_USE_PREFIX ? null : new ArrayList<>();
LiteralArgumentBuilder<CommandSourceStack> literalArgumentBuilder = Commands.literal(com.r3944realms.leashedplayer.content.commands.Command.PREFIX);
LiteralArgumentBuilder<CommandSourceStack> $$motionRoot = getLiterArgumentBuilderOfCSS("motion", !shouldUsePrefix, nodeList);
LiteralArgumentBuilder<CommandSourceStack> $$motionRoot = getLiterArgumentBuilderOfCSS("motion", !SHOULD_USE_PREFIX, nodeList);
com.mojang.brigadier.Command<CommandSourceStack> motionVecAdder = context -> {
CommandSourceStack source = context.getSource();
for(Entity entity : EntityArgument.getEntities(context, "targets")){
@ -116,7 +115,7 @@ public class MotionCommand {
)
)
);
if(shouldUsePrefix){
if(SHOULD_USE_PREFIX){
literalArgumentBuilder.then(Motion);
dispatcher.register(literalArgumentBuilder);
} else {

View File

@ -4,7 +4,6 @@ import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.arguments.FloatArgumentType;
import com.mojang.brigadier.arguments.IntegerArgumentType;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.r3944realms.leashedplayer.config.LeashPlayerCommonConfig;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
import net.minecraft.commands.SharedSuggestionProvider;
@ -19,15 +18,15 @@ import java.util.Arrays;
import java.util.List;
import static com.r3944realms.leashedplayer.content.commands.Command.getLiterArgumentBuilderOfCSS;
import static com.r3944realms.leashedplayer.content.commands.Command.SHOULD_USE_PREFIX;
public class TickCommand {
private static final String DEFAULT_TICKRATE = String.valueOf(20);
public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {
boolean shouldUsePrefix = LeashPlayerCommonConfig.EnableLeashPlayerCommandPrefix.get();
@Nullable List<LiteralArgumentBuilder<CommandSourceStack>> nodeList = shouldUsePrefix ? null : new ArrayList<>();
@Nullable List<LiteralArgumentBuilder<CommandSourceStack>> nodeList = SHOULD_USE_PREFIX ? null : new ArrayList<>();
LiteralArgumentBuilder<CommandSourceStack> literalArgumentBuilder = Commands.literal(com.r3944realms.leashedplayer.content.commands.Command.PREFIX);
LiteralArgumentBuilder<CommandSourceStack> $$TickRoot = getLiterArgumentBuilderOfCSS("tick", !shouldUsePrefix, nodeList);
LiteralArgumentBuilder<CommandSourceStack> $$TickRoot = getLiterArgumentBuilderOfCSS("tick", !SHOULD_USE_PREFIX, nodeList);
LiteralArgumentBuilder<CommandSourceStack> Tick = $$TickRoot.requires(p_308941_ -> p_308941_.hasPermission(2))
.then(Commands.literal("query").executes(p_308950_ -> tickQuery(p_308950_.getSource())))
@ -60,7 +59,7 @@ public class TickCommand {
)
.then(Commands.literal("unfreeze").executes(p_309184_ -> setFreeze(p_309184_.getSource(), false)))
.then(Commands.literal("freeze").executes(p_309070_ -> setFreeze(p_309070_.getSource(), true)));
if(shouldUsePrefix){
if(SHOULD_USE_PREFIX){
literalArgumentBuilder.then(Tick);
dispatcher.register(literalArgumentBuilder);
} else {

View File

@ -0,0 +1,25 @@
package com.r3944realms.leashedplayer.content.gamerules.Server;
import com.r3944realms.leashedplayer.LeashedPlayer;
import com.r3944realms.leashedplayer.content.gamerules.Gamerules;
import com.r3944realms.leashedplayer.utils.Util;
import net.minecraft.world.level.GameRules;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;
import static com.r3944realms.leashedplayer.content.gamerules.Gamerules.GAMERULE_REGISTRY;
@EventBusSubscriber(modid = LeashedPlayer.MOD_ID, bus = EventBusSubscriber.Bus.MOD)
public class CanCommonPlayerChangeSelfTalkArea {
public static final boolean DEFAULT_VALUE = true;
public static final String ID = Util.getGameruleName(CanCommonPlayerChangeSelfTalkArea.class);
public static final String DESCRIPTION_KEY = Gamerules.getDescriptionKey(CanCommonPlayerChangeSelfTalkArea.class);
public static final String NAME_KEY = Gamerules.getNameKey(CanCommonPlayerChangeSelfTalkArea.class);
public static final GameRules.Category CATEGORY = GameRules.Category.PLAYER;
@SubscribeEvent
public static void onCommonSetup(final FMLCommonSetupEvent event) {
GAMERULE_REGISTRY.registerGamerule(ID, CATEGORY, DEFAULT_VALUE);
}
}

View File

@ -1,6 +1,7 @@
package com.r3944realms.leashedplayer.datagen.LanguageAndOtherData;
import com.r3944realms.leashedplayer.ClientEventHandler;
import com.r3944realms.leashedplayer.content.ModKeyMapping;
import com.r3944realms.leashedplayer.content.commands.ChatCommand;
import com.r3944realms.leashedplayer.content.commands.LeashCommand;
import com.r3944realms.leashedplayer.content.commands.MotionCommand;
@ -29,6 +30,8 @@ import static com.r3944realms.leashedplayer.content.items.ModCreativeTab.LEASHED
public enum ModLangKeyValue {
ADDICTION(ClientEventHandler.ADDICTION, ModPartEnum.NAME, "You've triggered the anti-addiction mechanic, and you'll come back when you rest!", "你触发了防沉迷机制,休息会再来吧!", "你觸發了防沉迷機制,休息會再來吧!", false),
KEY_CATEGORY(ModKeyMapping.CATEGORY, ModPartEnum.NAME, "Leashed Player", "可拴玩家", "可拴玩家", false),
KEY_APPLY_TALKAREA(ModKeyMapping.APPLY_TALKAREA_PREFERENCE_KEY, ModPartEnum.NAME, "Apply TalkArea Preference", "应用可见区域预设", "應用設置可見區域預設", false),
//ITEM
ITEM_LEASH_ROPE_ARROW(ModItemRegister.LEASH_ROPE_ARROW, ModPartEnum.ITEM, "Leash Rope Arrow", "拴绳箭", "拴繩箭", true),
ITEM_SPECTRAL_LEASH_ROPE_ARROW(ModItemRegister.SPECTRAL_LEASH_ROPE_ARROW, ModPartEnum.ITEM, "Spectral Leash Rope Arrow", "拴绳光灵箭", "拴繩光靈箭", true),
@ -87,13 +90,15 @@ public enum ModLangKeyValue {
MESSAGE_CHAT_TALKAREA_UNLIMITED(ChatCommand.TALK_AREA_UNLIMITED, ModPartEnum.COMMAND, "%s 's §atalk area unlimited!§r", "%s§a聊天区域半径无限制§r", "%s§a聊天區域半徑無限制§r","%s§a语矢无限§r" ,false),
MESSAGE_CHAT_TALKAREA_PREFERENCE_NOT_SET(ChatCommand.TALK_AREA_PREFERENCE_NOT_SET, ModPartEnum.COMMAND, "%s 's talk area preference is not set!", "%s未设置默认可见消息聊天区域半径", "%s未設置可見訊息聊天半徑", "%s未置默视之",false),
MESSAGE_CHAT_TALKAREA_CURRENT_CONFIG(ChatCommand.TALK_AREA_CURRENT_CONFIG, ModPartEnum.COMMAND, "%s 's §6TalkArea Current§7:§e %d §6blocks §f(§aPrefence§7:§e %d §ablocks§f)§r", "%s§6目前聊天区域可见半径设置§7:§e %d §6格 §f(§a默认值§7:§e %d §a格§f)§r", "%s§6目前可見訊息聊天半徑設置§7:§e%d §6格 §f(§a默認值§7:§e%d §a格§f)§r", "%s§6今聊城可知半径置§e %d§6格§f(§a默§7§e%d格§f)§r",false),
MESSAGE_CHAT_TALKAREA_NO_RIGHT(ChatCommand.NO_RIGHT, ModPartEnum.COMMAND, "You haven't the right to do that!", "你无权这样做!", "你無權這麽做!", false),
//GAME_RULE_NAME
DEFAULT_AREA_TALK_NAME(DefaultTalkArea.NAME_KEY, ModPartEnum.NAME, "Default Area Talk", "默认聊天区域可见半径", "默認聊天區域可見半徑",false),
TELEPORT_WITH_LEASHED_PLAYERS(TeleportWithLeashedPlayers.NAME_KEY, ModPartEnum.NAME, "Teleport leashed player with player holder", "被拴玩家随玩家持有者传送", "被拴玩家随玩家持有者傳送" ,false),
CREATE_LEASH_FENCE_KNOT_ENTITY_IF_ABSENT(CreateLeashFenceKnotEntityIfAbsent.NAME_KEY, ModPartEnum.NAME, "Create Leash Fence Knot Entity if absent", "如果缺失则创建拴绳结", "如果缺失則創建拴繩結", false),
KEEP_LEASH_NOT_DROP_TIME(KeepLeashNotDropTime.NAME_KEY, ModPartEnum.NAME, "Keep leash alive Time", "保持拴绳不掉落的时间", "保持其不掉落的時間", false),
TELEPORT_WITH_LEASHED_PLAYERS_NAME(TeleportWithLeashedPlayers.NAME_KEY, ModPartEnum.NAME, "Teleport leashed player with player holder", "被拴玩家随玩家持有者传送", "被拴玩家随玩家持有者傳送" ,false),
CREATE_LEASH_FENCE_KNOT_ENTITY_IF_ABSENT_NAME(CreateLeashFenceKnotEntityIfAbsent.NAME_KEY, ModPartEnum.NAME, "Create Leash Fence Knot Entity if absent", "如果缺失则创建拴绳结", "如果缺失則創建拴繩結", false),
KEEP_LEASH_NOT_DROP_TIME_NAME(KeepLeashNotDropTime.NAME_KEY, ModPartEnum.NAME, "Keep leash alive Time", "保持拴绳不掉落的时间", "保持其不掉落的時間", false),
OTOPNMWSINN_MAME(OpenTOPNeededModeWhenScreenIsNotNull.NAME_KEY, ModPartEnum.NAME, "Open TOP NEEDED Mode When Screen isn't null", "当屏幕不为空时自动打开探测器的Needed模式", "避免糠測器糠屏幕", false),
CAN_COMMON_PLAYER_CHANGER_SELF_TALKAREA_NAME(CanCommonPlayerChangeSelfTalkArea.NAME_KEY, ModPartEnum.NAME, "Should Non-OP Player can change their TalkArea", "非OP应该可以修改自己的聊天可见半径吗?", "非OP應該可以修改自己的聊天可見半徑嗎", false),
// DISABLE_MOVE_CHECK(DisablePlayerMoveCheck.NAME_KEY, ModPartEnum.NAME, "Disable Player Move Check", "禁止检查玩家移动", "禁止檢查玩家移動", false),
//GAME_RULE_DESCRIPTION
@ -103,6 +108,8 @@ public enum ModLangKeyValue {
// DISABLE_MOVE_CHECK_DESCRIPTION(DisablePlayerMoveCheck.DESCRIPTION_KEY, ModPartEnum.DESCRIPTION, "Disable the player's movement Check And Correct it.", "禁止检查玩家移动并且纠正它","禁止檢查玩家移動並糾正他它", false),
OTOPNMWSINN_DESCRIPTION(OpenTOPNeededModeWhenScreenIsNotNull.DESCRIPTION_KEY, ModPartEnum.DESCRIPTION, "The One Probe will automatic to be in the Needed Mode when Gui Screen is not NULL", "当屏幕不为空时自动打开探测器的Needed模式", "避免糠測器糠屏幕", false),
DEFAULT_AREA_TALK_DESCRIPTION(DefaultTalkArea.DESCRIPTION_KEY, ModPartEnum.DESCRIPTION, "When the global setting is non-negative, it limits the chat range for all players. If a player's configured chat range is smaller than this value, this rule applies. Otherwise, the player's custom value is used.", "全局区域设置为非负数时,则限制全体玩家的聊天区域。若玩家设置的聊天区域小于该值则采用该规则,反之则采用玩家自定义值", "儅全局區域為非負時,則限制全服玩家聊天區域。若玩家自定義值小於該規則則采用,反之則用玩家自定義值","阖局初置非负数,则限一顾之日下,若立聊城小在直则用其常,若用玩义直上跻之地", false),
CAN_COMMON_PLAYER_CHANGER_SELF_TALKAREA_DESCRIPTION(CanCommonPlayerChangeSelfTalkArea.DESCRIPTION_KEY, ModPartEnum.DESCRIPTION, "Above on its Name", "同名", "同名", false),
//ADV_NAME
LEASH_START(ModAdvancementKey.LEASH_START.getNameKey(), ModPartEnum.NAME, "The Power of Traction", "牵引之力", "牽引之力", false),
LEASH_LR_ARROW(ModAdvancementKey.LEASH_ARROW.getNameKey(), ModPartEnum.NAME, "Arrow with a Tether?" , "拴绳之箭?", "拴繩之箭?", false),