2024/11/02

Fix some little bug
Add areaTalk Command
This commit is contained in:
叁玖领域 2024-11-02 23:25:07 +08:00
parent 6fcdbefe61
commit 3cb1cc3ccc
23 changed files with 491 additions and 25 deletions

View File

@ -1,4 +1,4 @@
# 版本 0.0.3.9.6 提前介绍c[最终版本对于0.0.4] 【注意:本解釋簡繁混寫,因爲趕時間,所以並不怎麽規範,請諒解】
# 版本 0.0.3.9.7 提前介绍c[最终版本对于0.0.4] 【注意:本解釋簡繁混寫,因爲趕時間,所以並不怎麽規範,請諒解】
## 简介
现在开始你可以用拴绳拴住玩家,也可以拴住自己了,不如尝试拴住彼此来通关我的世界吧(
@ -44,12 +44,17 @@
* `/lp motion [<实体[可多个对象]>] add/set/multiply <x> <y> <z>` - 给实体添加/设置/倍乘 加速度
* `/lp talkArea <[<玩家[可多个对象]>]> set/setPreference/unlimited/currentConfig <数值>` - 设置玩家聊天可见半径/设置半径预期/应用预期/取消限制/获取目前配置
* `/lp tick ...` - 用法同原版Tick但权限降为2只用于调试切勿滥用后期考虑可能写成区域性的
## 游戏规则
* `LP.TeleportWithLeashedPlayers` - 此規則啓用后, 被栓玩家將會随玩家拴绳持有者一起传送 [默认值: True]
* `LP.CreateLeashFenceKnotEntityIfAbsent` - 此規則啓用后, 在設置 leashData 時,如果對應方塊坐標上的柵欄沒有拴繩結則會自動創建這個實體並綁定 [默认值: True]
* `LP.KeepLeashNotDropTime` - 此规则决定,当拴绳关系创建时一段时间里,即是距离已经达到了断裂距离,也保持其不断裂 [默认值: 240ticks ,可设置范围[80, 1200]ticks]
* `LP.KeepLeashNotDropTime` - 此规则决定,当拴绳关系创建时一段时间里,即是距离已经达到了断裂距离,也保持其不断裂 [默认值: 240ticks ,可设置范围[80, 1200]ticks]
* `LP.DefaultTalkArea` - 此规则决定,聊天半径最小正值

View File

@ -32,7 +32,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.6
mod_version=0.0.3.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-01T07:39:29.8201048 Languages: en_us for mod: leashedplayer
fbdc31c7f0d55b42c8791317b00f5b1f274a485d assets/leashedplayer/lang/en_us.json
// 1.21 2024-11-02T23:21:56.3625648 Languages: en_us for mod: leashedplayer
dad5064bbdf42ff624b9a0b7f24b17274fa247c2 assets/leashedplayer/lang/en_us.json

View File

@ -1,2 +1,2 @@
// 1.21 2024-10-23T13:15:06.1042677 Languages: lzh for mod: leashedplayer
bf21a9e8fbc5a3846fb05b4fa0859e0917b2202f assets/leashedplayer/lang/lzh.json
// 1.21 2024-11-02T23:04:02.4438077 Languages: lzh for mod: leashedplayer
b13bfd7bcb371f7da65fe06086a3db47da2de9cd assets/leashedplayer/lang/lzh.json

View File

@ -1,2 +1,2 @@
// 1.21 2024-11-01T07:39:29.8201048 Languages: zh_cn for mod: leashedplayer
d924feb216747a1becae38425bebef06c530d688 assets/leashedplayer/lang/zh_cn.json
// 1.21 2024-11-02T23:21:56.3615582 Languages: zh_cn for mod: leashedplayer
2e3e8d720e46344cc2069590242ef2ab9fbdb435 assets/leashedplayer/lang/zh_cn.json

View File

@ -1,2 +1,2 @@
// 1.21 2024-11-01T07:39:29.8181255 Languages: zh_tw for mod: leashedplayer
0bf655237967960872a2b0c2397f692c59324717 assets/leashedplayer/lang/zh_tw.json
// 1.21 2024-11-02T23:21:56.3599006 Languages: zh_tw for mod: leashedplayer
a3d780ceee5ee80b007fd0ed01c91c256f82b5a4 assets/leashedplayer/lang/zh_tw.json

View File

@ -23,6 +23,8 @@
"entity.leashedplayer.spectral_leash_rope_arrow": "Spectral Leash Rope Arrow",
"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",
"gamerule.LP.DefaultTalkArea.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.",
"gamerule.LP.KeepLeashNotDropTime": "Keep leash alive Time",
"gamerule.LP.KeepLeashNotDropTime.description": "The time of Keep new leash which has far distance alive (Tick)",
"gamerule.LP.TeleportWithLeashedPlayers": "Teleport leashed player with player holder",
@ -36,6 +38,17 @@
"item.minecraft.potion.effect.no_leash": "No Leash Potion",
"item.minecraft.splash_potion.effect.no_leash": "Splash No Leash Potion",
"item.minecraft.tipped_arrow.effect.no_leash": "Arrow of No Leash",
"leashedplayer.chat.none_heard_you": "Nobody heard your message",
"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!",
"leashedplayer.command.chat.message.talkarea.self.current_config": "§6TalkArea Current§7:§e %d §6blocks §f(§aPrefence§7:§e %d §ablocks§f)§r",
"leashedplayer.command.chat.message.talkarea.self.preference.set": "§aTalk area preference set to §e%d§a blocks!§r",
"leashedplayer.command.chat.message.talkarea.self.preference_not_set": "Your talk area preference is not set!",
"leashedplayer.command.chat.message.talkarea.self.set": "§aTalk area set to §e%d§a blocks!§r",
"leashedplayer.command.chat.message.talkarea.self.unlimited": "§aTalk area unlimited!§r",
"leashedplayer.command.chat.message.talkarea.set": "%s 's §atalk area set to §e%d§a blocks!§r",
"leashedplayer.command.chat.message.talkarea.unlimited": "%s 's §atalk area unlimited!§r",
"leashedplayer.command.leash.message.leash.data.clear": "%1$s's LeashData(LeashHolderEntity: %2$s) now is clear",
"leashedplayer.command.leash.message.leash.data.clear.leash.clear.failed.no_data": "%1$s has no LeashData can be clear",
"leashedplayer.command.leash.message.leash.data.null": "%1$s has no LeashDataEntity",

View File

@ -1 +1,14 @@
{}
{
"gamerule.LP.DefaultTalkArea.description": "阖局初置非负数,则限一顾之日下,若立聊城小在直则用其常,若用玩义直上跻之地",
"leashedplayer.chat.none_heard_you": "无人受子问",
"leashedplayer.command.chat.message.talkarea.current_config": "%s§6今聊城可知半径置§e %d§6格§f(§a默§7§e%d格§f)§r",
"leashedplayer.command.chat.message.talkarea.preference.set": "%s§6默置§e %d§6格§r",
"leashedplayer.command.chat.message.talkarea.preference_not_set": "%s未置默视之",
"leashedplayer.command.chat.message.talkarea.self.current_config": "§6今聊城可知半径置§e %d§6格§f(§a默§7§e%d格§f)§r",
"leashedplayer.command.chat.message.talkarea.self.preference.set": "§6默置§e %d§6格§r",
"leashedplayer.command.chat.message.talkarea.self.preference_not_set": "未置默视之",
"leashedplayer.command.chat.message.talkarea.self.set": "§6今聊城可知半径置§e%d §6格§r",
"leashedplayer.command.chat.message.talkarea.self.unlimited": "§a语矢无限§r",
"leashedplayer.command.chat.message.talkarea.set": "%s§6今聊城可知半径置§e%d §6格§r",
"leashedplayer.command.chat.message.talkarea.unlimited": "%s§a语矢无限§r"
}

View File

@ -23,6 +23,8 @@
"entity.leashedplayer.spectral_leash_rope_arrow": "拴绳光灵箭",
"gamerule.LP.CreateLeashFenceKnotEntityIfAbsent": "如果缺失则创建拴绳结",
"gamerule.LP.CreateLeashFenceKnotEntityIfAbsent.description": "如果在栅栏处缺失拴绳结,则创建它",
"gamerule.LP.DefaultTalkArea": "默认聊天区域可见半径",
"gamerule.LP.DefaultTalkArea.description": "全局区域设置为非负数时,则限制全体玩家的聊天区域。若玩家设置的聊天区域小于该值则采用该规则,反之则采用玩家自定义值",
"gamerule.LP.KeepLeashNotDropTime": "保持拴绳不掉落的时间",
"gamerule.LP.KeepLeashNotDropTime.description": "当距离过远时,保持新建拴绳不掉落的时间 (刻)",
"gamerule.LP.TeleportWithLeashedPlayers": "被拴玩家随玩家持有者传送",
@ -36,6 +38,17 @@
"item.minecraft.potion.effect.no_leash": "禁拴药水",
"item.minecraft.splash_potion.effect.no_leash": "喷溅型禁拴药水",
"item.minecraft.tipped_arrow.effect.no_leash": "禁拴之箭",
"leashedplayer.chat.none_heard_you": "沒有人接收到你的消息",
"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未设置默认可见消息聊天区域半径",
"leashedplayer.command.chat.message.talkarea.self.current_config": "§6目前聊天区域可见半径设置§7:§e %d §6格 §f(§a默认值§7:§e %d §a格§f)§r",
"leashedplayer.command.chat.message.talkarea.self.preference.set": "§a默认聊天区域可见消息半径设置为 §e%d §a格!§r",
"leashedplayer.command.chat.message.talkarea.self.preference_not_set": "未设置默认可见消息聊天区域半径",
"leashedplayer.command.chat.message.talkarea.self.set": "§a聊天区域可见消息半径设置为 §e%d §a格!§r",
"leashedplayer.command.chat.message.talkarea.self.unlimited": "§a聊天区域半径无限制§r",
"leashedplayer.command.chat.message.talkarea.set": "%s§a聊天区域可见消息半径设置为 §e%d §a格!§r",
"leashedplayer.command.chat.message.talkarea.unlimited": "%s§a聊天区域半径无限制§r",
"leashedplayer.command.leash.message.leash.data.clear": "%1$s的拴绳数据拴绳持有者实体%2$s现在已清除",
"leashedplayer.command.leash.message.leash.data.clear.leash.clear.failed.no_data": "%1$s沒有拴绳数据可清除",
"leashedplayer.command.leash.message.leash.data.null": "%1$s沒有拴绳数据实体",

View File

@ -23,6 +23,8 @@
"entity.leashedplayer.spectral_leash_rope_arrow": "拴繩光靈箭",
"gamerule.LP.CreateLeashFenceKnotEntityIfAbsent": "如果缺失則創建拴繩結",
"gamerule.LP.CreateLeashFenceKnotEntityIfAbsent.description": "如果在柵欄処缺失拴繩結,則創建它",
"gamerule.LP.DefaultTalkArea": "默認聊天區域可見半徑",
"gamerule.LP.DefaultTalkArea.description": "儅全局區域為非負時,則限制全服玩家聊天區域。若玩家自定義值小於該規則則采用,反之則用玩家自定義值",
"gamerule.LP.KeepLeashNotDropTime": "保持其不掉落的時間",
"gamerule.LP.KeepLeashNotDropTime.description": "儅距離過遠時,保持其不掉落的時間(刻)",
"gamerule.LP.TeleportWithLeashedPlayers": "被拴玩家随玩家持有者傳送",
@ -36,6 +38,17 @@
"item.minecraft.potion.effect.no_leash": "禁拴藥水",
"item.minecraft.splash_potion.effect.no_leash": "噴濺型禁拴藥水",
"item.minecraft.tipped_arrow.effect.no_leash": "禁拴之箭",
"leashedplayer.chat.none_heard_you": "無人接收到你的訊息",
"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未設置可見訊息聊天半徑",
"leashedplayer.command.chat.message.talkarea.self.current_config": "§6目前可見訊息聊天半徑設置§7:§e%d §6格 §f(§a默認值§7:§e%d §a格§f)§r",
"leashedplayer.command.chat.message.talkarea.self.preference.set": "§a默認聊天區域可見訊息半徑設置為 §e%d §a格!§r",
"leashedplayer.command.chat.message.talkarea.self.preference_not_set": "未設置可見訊息聊天半徑",
"leashedplayer.command.chat.message.talkarea.self.set": "§a聊天區域可見半徑為 §e%d §a格!§r",
"leashedplayer.command.chat.message.talkarea.self.unlimited": "§a聊天區域半徑無限制§r",
"leashedplayer.command.chat.message.talkarea.set": "%s§a聊天區域可見半徑為 §e%d §a格!§r",
"leashedplayer.command.chat.message.talkarea.unlimited": "%s§a聊天區域半徑無限制§r",
"leashedplayer.command.leash.message.leash.data.clear": "%1$s的拴繩數據拴繩持有者實體%2$s現在已清除",
"leashedplayer.command.leash.message.leash.data.clear.leash.clear.failed.no_data": "%1$s沒有拴繩數據實體可被清除",
"leashedplayer.command.leash.message.leash.data.null": "%1$s沒有拴繩數據實體",

View File

@ -1,6 +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;
@ -35,6 +36,7 @@ public class CommonEventHandler {
CommandDispatcher<CommandSourceStack> dispatcher = event.getDispatcher();
LeashCommand.register(dispatcher);
MotionCommand.register(dispatcher);
ChatCommand.register(dispatcher);
TickCommand.register(dispatcher);
}
@SubscribeEvent

View File

@ -0,0 +1,164 @@
package com.r3944realms.leashedplayer.content.commands;
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.modInterface.ServerPlayerCapacity;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
import net.minecraft.commands.arguments.EntityArgument;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import static com.r3944realms.leashedplayer.content.commands.Command.getLiterArgumentBuilderOfCSS;
public class ChatCommand {
private static final String LP_CHAT_MESSAGE_ = "leashedplayer.command.chat.message.";
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",
SELF_TALK_AREA_UNLIMITED = LP_CHAT_MESSAGE_ + "talkarea.self.unlimited",
SELF_TALK_AREA_CURRENT_CONFIG = LP_CHAT_MESSAGE_ + "talkarea.self.current_config",
TALK_AREA_SET = LP_CHAT_MESSAGE_ + "talkarea.set",
TALK_AREA_PREFERENCE_SET = LP_CHAT_MESSAGE_ + "talkarea.preference.set",
TALK_AREA_PREFERENCE_NOT_SET = LP_CHAT_MESSAGE_ + "talkarea.preference_not_set",
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<>();
LiteralArgumentBuilder<CommandSourceStack> literalArgumentBuilder = Commands.literal(com.r3944realms.leashedplayer.content.commands.Command.PREFIX);
LiteralArgumentBuilder<CommandSourceStack> $$leashRoot = getLiterArgumentBuilderOfCSS("talkArea", !shouldUsePrefix, nodeList);
Command<CommandSourceStack> chat$self$talkArea_set = (context -> {
CommandSourceStack source = context.getSource();
ServerPlayerCapacity serverPlayer = (ServerPlayerCapacity) source.getPlayerOrException();
int integer = IntegerArgumentType.getInteger(context, "talkAreaRadius");
serverPlayer.setTalkArea(integer);
source.sendSuccess(() -> Component.translatable(SELF_TALK_AREA_SET, integer),true);
return 0;
});
Command<CommandSourceStack> chat$self$talkArea_preference_set = (context -> {
CommandSourceStack source = context.getSource();
ServerPlayerCapacity serverPlayer = (ServerPlayerCapacity) source.getPlayerOrException();
int integer = IntegerArgumentType.getInteger(context, "talkAreaPreferenceRadius");
serverPlayer.setTalkAreaPreference(integer);
source.sendSuccess(() -> Component.translatable(SELF_TALK_AREA_PREFERENCE_SET, integer),true);
return 0;
});
Command<CommandSourceStack> chat$self$talkArea_usePreference = (context -> {
CommandSourceStack source = context.getSource();
ServerPlayerCapacity serverPlayer = (ServerPlayerCapacity) source.getPlayerOrException();
if(serverPlayer.getTalkAreaPreference() == -1) {
source.sendFailure(Component.translatable(SELF_TALK_AREA_PREFERENCE_NOT_SET));
return 1;
}
int currentPreference = serverPlayer.getTalkAreaPreference();
serverPlayer.setTalkArea(currentPreference);
source.sendSuccess(() -> Component.translatable(SELF_TALK_AREA_PREFERENCE_SET, currentPreference),true);
return 0;
});
Command<CommandSourceStack> chat$self$talkArea_unlimited = (context -> {
CommandSourceStack source = context.getSource();
ServerPlayerCapacity serverPlayer = (ServerPlayerCapacity) source.getPlayerOrException();
serverPlayer.setTalkArea(-1);
source.sendSuccess(() -> Component.translatable(SELF_TALK_AREA_UNLIMITED),true);
return 0;
});
Command<CommandSourceStack> chat$self$talkArea_getCurrentConfig = (context -> {
CommandSourceStack source = context.getSource();
ServerPlayerCapacity serverPlayer = (ServerPlayerCapacity) source.getPlayerOrException();
source.sendSuccess(() -> Component.translatable(SELF_TALK_AREA_CURRENT_CONFIG,serverPlayer.getTalkArea(),serverPlayer.getTalkAreaPreference()),true);
return 0;
});
Command<CommandSourceStack> chat$talkArea_set = (context -> {
CommandSourceStack source = context.getSource();
Collection<ServerPlayer> players = EntityArgument.getPlayers(context, "players");
int integer = IntegerArgumentType.getInteger(context, "talkAreaRadius");
players.forEach(i-> {
((ServerPlayerCapacity)i).setTalkArea(integer);
source.sendSuccess(() -> Component.translatable(TALK_AREA_SET, i.getName().copy().withStyle(), integer),true);
});
return 0;
});
Command<CommandSourceStack> chat$talkArea_preference_set = (context -> {
CommandSourceStack source = context.getSource();
Collection<ServerPlayer> players = EntityArgument.getPlayers(context, "players");
int integer = IntegerArgumentType.getInteger(context, "talkAreaPreferenceRadius");
players.forEach(i-> {
((ServerPlayerCapacity)i).setTalkAreaPreference(integer);
source.sendSuccess(() -> Component.translatable(TALK_AREA_PREFERENCE_SET, i.getName().copy().withStyle(), integer),true);
});
return 0;
});
Command<CommandSourceStack> chat$talkArea_usePreference = (context -> {
CommandSourceStack source = context.getSource();
Collection<ServerPlayer> players = EntityArgument.getPlayers(context, "players");
players.forEach(i-> {
int talkAreaPreference = ((ServerPlayerCapacity)i).getTalkAreaPreference();
if(talkAreaPreference == -1) {
source.sendFailure(Component.translatable(TALK_AREA_PREFERENCE_NOT_SET,i.getName().copy().withStyle()));
} else {
((ServerPlayerCapacity) i).setTalkArea(talkAreaPreference);
source.sendSuccess(() -> Component.translatable(TALK_AREA_PREFERENCE_SET, i.getName().copy().withStyle(), talkAreaPreference),true);
}
});
return 0;
});
Command<CommandSourceStack> chat$talkArea_unlimited = (context -> {
CommandSourceStack source = context.getSource();
Collection<ServerPlayer> players = EntityArgument.getPlayers(context, "players");
players.forEach(i-> {
((ServerPlayerCapacity)i).setTalkArea(-1);
source.sendSuccess(() -> Component.translatable(TALK_AREA_UNLIMITED, i.getName().copy().withStyle()),true);
});
return 0;
});
Command<CommandSourceStack> chat$talkArea_getCurrentConfig = (context -> {
CommandSourceStack source = context.getSource();
Collection<ServerPlayer> players = EntityArgument.getPlayers(context, "players");
players.forEach(i-> source.sendSuccess(() -> Component.translatable(TALK_AREA_CURRENT_CONFIG, i.getName().copy().withStyle(),((ServerPlayerCapacity)i).getTalkArea(),((ServerPlayerCapacity)i).getTalkAreaPreference()), true));
return 0;
});
LiteralArgumentBuilder<CommandSourceStack> selfTalkAreaSet = $$leashRoot.then(Commands.literal("set")
.then(Commands.argument("talkAreaRadius", IntegerArgumentType.integer(0))
.executes(chat$self$talkArea_set)))
.then(Commands.literal("setPreference")
.then(Commands.argument("talkAreaPreferenceRadius", IntegerArgumentType.integer(0))
.executes(chat$self$talkArea_preference_set)))
.then(Commands.literal("usePreference")
.executes(chat$self$talkArea_usePreference))
.then(Commands.literal("unlimited")
.executes(chat$self$talkArea_unlimited))
.then(Commands.literal("currentConfig")
.executes(chat$self$talkArea_getCurrentConfig));
LiteralArgumentBuilder<CommandSourceStack> TalkAreaCommon = $$leashRoot.then(Commands.argument("players", EntityArgument.players()).requires(cs -> cs.hasPermission(2))
.then(Commands.literal("set")
.then(Commands.argument("talkAreaRadius", IntegerArgumentType.integer(0))
.executes(chat$talkArea_set)))
.then(Commands.literal("setPreference")
.then(Commands.argument("talkAreaPreferenceRadius", IntegerArgumentType.integer(0))
.executes(chat$talkArea_preference_set)))
.then(Commands.literal("usePreference")
.executes(chat$talkArea_usePreference))
.then(Commands.literal("unlimited")
.executes(chat$talkArea_unlimited))
.then(Commands.literal("currentConfig")
.executes(chat$talkArea_getCurrentConfig)));
if(shouldUsePrefix) {
literalArgumentBuilder.then(selfTalkAreaSet);
literalArgumentBuilder.then(TalkAreaCommon);
dispatcher.register(literalArgumentBuilder);
} else {
nodeList.forEach(dispatcher::register);
}
}
}

View File

@ -250,9 +250,7 @@ public class LeashCommand {
CommandSourceStack source = context.getSource();
try {
Collection<ServerPlayer> playerCol = EntityArgument.getPlayers(context, "targetPlayers");
playerCol.forEach(player -> {
LeashDataBlockPosSetResultInt(context, source, player);
});
playerCol.forEach(player -> LeashDataBlockPosSetResultInt(context, source, player));
} catch (Exception e) {
source.sendFailure(Component.translatable(LEASH_FAILED));
@ -292,7 +290,7 @@ public class LeashCommand {
try {
ServerPlayer player = EntityArgument.getPlayer(context, "targetPlayer");
Integer x = LeashDataClearResultInt(source, PlayerLeashable.getLeashDataEntity(player, source.getLevel()),player);
if (x != null) return x;
} catch (Exception e) {
source.sendFailure(Component.translatable(LEASH_FAILED));
return -1;

View File

@ -63,7 +63,7 @@ public class MotionCommand {
entity.setDeltaMovement(motionVec);
}
double vecX = entity.getDeltaMovement().x, vecY = entity.getDeltaMovement().y, vecZ = entity.getDeltaMovement().z;
source.sendSuccess(() -> Component.translatable(MOTION_SETTER_SUCCESSFUL, entity.getName().copy(), vecX, vecY, vecZ), true);
source.sendSuccess(() -> Component.translatable(MOTION_SETTER_SUCCESSFUL, entity.getName().copy().withStyle(), vecX, vecY, vecZ), true);
}
return 0;
};
@ -81,7 +81,7 @@ public class MotionCommand {
entity.setDeltaMovement(entity.getDeltaMovement().multiply(motionFactorVec));
}
double vecX = entity.getDeltaMovement().x, vecY = entity.getDeltaMovement().y, vecZ = entity.getDeltaMovement().z;
source.sendSuccess(() -> Component.translatable(MOTION_MULTIPLY_SUCCESSFUL, entity.getName().copy(), vecX, vecY, vecZ), true);
source.sendSuccess(() -> Component.translatable(MOTION_MULTIPLY_SUCCESSFUL, entity.getName().copy().withStyle(), vecX, vecY, vecZ), true);
}
return 0;
};

View File

@ -21,7 +21,6 @@ import java.util.List;
import static com.r3944realms.leashedplayer.content.commands.Command.getLiterArgumentBuilderOfCSS;
public class TickCommand {
private static final float MAX_TICKRATE = 10000.0F;
private static final String DEFAULT_TICKRATE = String.valueOf(20);
public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {

View File

@ -0,0 +1,26 @@
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 DefaultTalkArea {
public static String CHAT_NONE_HEARD_YOU = "leashedplayer.chat.none_heard_you";
public static final int DEFAULT_VALUE = -1;
public static final String ID = Util.getGameruleName(DefaultTalkArea.class);
public static final String DESCRIPTION_KEY = Gamerules.getDescriptionKey(DefaultTalkArea.class);
public static final String NAME_KEY = Gamerules.getNameKey(DefaultTalkArea.class);
public static final GameRules.Category CATEGORY = GameRules.Category.CHAT;
@SubscribeEvent
public static void commonSetup(final FMLCommonSetupEvent event) {
GAMERULE_REGISTRY.registerGamerule(ID, CATEGORY, DEFAULT_VALUE);
}
}

View File

@ -4,7 +4,6 @@ import com.r3944realms.leashedplayer.LeashedPlayer;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.registries.Registries;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.decoration.PaintingVariant;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.alchemy.Potion;
@ -22,7 +21,7 @@ public class ModCreativeTab {
DeferredRegister.create(Registries.CREATIVE_MODE_TAB, LeashedPlayer.MOD_ID);
public static final String LEASHED_PLAYER_TAB_STRING = "creativetab." + LeashedPlayer.MOD_ID;
public static final String LEASHED_PLAYER_ITEM = "leashedplayer_tab";
public static final Supplier<CreativeModeTab> TEST_TAB = CREATIVE_MODE_TABS.register(LEASHED_PLAYER_ITEM,() -> CreativeModeTab.builder()
public static final Supplier<CreativeModeTab> MODE_TAB_SUPPLIER = CREATIVE_MODE_TABS.register(LEASHED_PLAYER_ITEM,() -> CreativeModeTab.builder()
.title(Component.translatable(getCreativeMod(LEASHED_PLAYER_ITEM)))
.icon(() -> ModItemRegister.LEASH_ROPE_ARROW.get().getDefaultInstance())
.displayItems(((pParameters, pOutput) -> {

View File

@ -33,7 +33,7 @@ public class ModItemRegister {
() -> new TestItem(new Item.Properties().stacksTo(1))
);
public static final Supplier<Item> AMETHYST_SHEARS = ModItemRegister.register("amethyst_shears",
() -> new LeadBreakerItem(new Item.Properties().durability(100).component(DataComponents.TOOL, ShearsItem.createToolProperties())
() -> new LeadBreakerItem(new Item.Properties().durability(100).component(DataComponents.TOOL, LeadBreakerItem.createToolProperties())
.stacksTo(1)));
public static Supplier<Item> register(String name, Supplier<Item> supplier) {

View File

@ -1,11 +1,13 @@
package com.r3944realms.leashedplayer.datagen.LanguageAndOtherData;
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.effects.ModEffectRegister;
import com.r3944realms.leashedplayer.content.effects.ModPotionRegister;
import com.r3944realms.leashedplayer.content.entities.ModEntityRegister;
import com.r3944realms.leashedplayer.content.gamerules.Server.CreateLeashFenceKnotEntityIfAbsent;
import com.r3944realms.leashedplayer.content.gamerules.Server.DefaultTalkArea;
import com.r3944realms.leashedplayer.content.gamerules.Server.KeepLeashNotDropTime;
import com.r3944realms.leashedplayer.content.gamerules.Server.TeleportWithLeashedPlayers;
import com.r3944realms.leashedplayer.content.items.ModCreativeTab;
@ -56,20 +58,31 @@ public enum ModLangKeyValue {
MESSAGE_MOTION_ADDER_SUCCESSFUL(MotionCommand.MOTION_ADDER_SUCCESSFUL, ModPartEnum.COMMAND, "§bAdd Successfully.§a%s§7:§f[§eVec§7: §a(§f%f§7,§f%f§7,§f%f§a)§f]§r","§b添加成功.§a%s§7:§f[§e加速度§7:§a(§f%f§7,§f%f§7,§f%f§a)§f]§r","§b添加成功.§a%s§7:§f[§e加速度§7:§a(§f%f§7,§f%f§7,§f%f§a)§f]§r", false),
MESSAGE_MOTION_SETTER_SUCCESSFUL(MotionCommand.MOTION_SETTER_SUCCESSFUL, ModPartEnum.COMMAND, "§bSet Successfully.§a%s§7:§f[§eVec§7: §a(§f%f§7,§f%f§7,§f%f§a)§f]§r","§b设置成功.§a%s§7:§f[§e加速度§7:§a(§f%f§7,§f%f§7,§f%f§a)§f]§r","§b設置成功.§a%s§7:§f[§e加速度§7:§a(§f%f§7,§f%f§7,§f%f§a)§f]§r",false),
MESSAGE_MOTION_MULTIPLY_SUCCESSFUL(MotionCommand.MOTION_MULTIPLY_SUCCESSFUL, ModPartEnum.COMMAND, "§bMultiply Successfully.§a%s§7:§f[§eVec§7: §a(§f%f§7,§f%f§7,§f%f§a)§f]§r","§b倍乘成功.§a%s§7:§f[§e加速度§7:§a(§f%f§7,§f%f§7,§f%f§a)§f]§r","§b倍乘成功.§a%s§7:§f[§e加速度§7:§a(§f%f§7,§f%f§7,§f%f§a)§f]§r",false),
MESSAGE_S_CHAT_TALKAREA_SET(ChatCommand.SELF_TALK_AREA_SET, ModPartEnum.COMMAND,"§aTalk area set to §e%d§a blocks!§r", "§a聊天区域可见消息半径设置为 §e%d §a格!§r", "§a聊天區域可見半徑為 §e%d §a格!§r", "§6今聊城可知半径置§e%d §6格§r",false),
MESSAGE_S_CHAT_TALKAREA_PREFERENCE_SET(ChatCommand.SELF_TALK_AREA_PREFERENCE_SET, ModPartEnum.COMMAND, "§aTalk area preference set to §e%d§a blocks!§r","§a默认聊天区域可见消息半径设置为 §e%d §a格!§r","§a默認聊天區域可見訊息半徑設置為 §e%d §a格!§r", "§6默置§e %d§6格§r", false),
MESSAGE_S_CHAT_TALKAREA_UNLIMITED(ChatCommand.SELF_TALK_AREA_UNLIMITED, ModPartEnum.COMMAND, "§aTalk area unlimited!§r", "§a聊天区域半径无限制§r", "§a聊天區域半徑無限制§r","§a语矢无限§r" ,false),
MESSAGE_S_CHAT_TALKAREA_PREFERENCE_NOT_SET(ChatCommand.SELF_TALK_AREA_PREFERENCE_NOT_SET, ModPartEnum.COMMAND, "Your talk area preference is not set!", "未设置默认可见消息聊天区域半径", "未設置可見訊息聊天半徑", "未置默视之",false),
MESSAGE_S_CHAT_TALKAREA_CURRENT_CONFIG(ChatCommand.SELF_TALK_AREA_CURRENT_CONFIG, ModPartEnum.COMMAND, "§6TalkArea Current§7:§e %d §6blocks §f(§aPrefence§7:§e %d §ablocks§f)§r", "§6目前聊天区域可见半径设置§7:§e %d §6格 §f(§a默认值§7:§e %d §a格§f)§r", "§6目前可見訊息聊天半徑設置§7:§e%d §6格 §f(§a默認值§7:§e%d §a格§f)§r", "§6今聊城可知半径置§e %d§6格§f(§a默§7§e%d格§f)§r",false),
MESSAGE_CHAT_TALKAREA_SET(ChatCommand.TALK_AREA_SET, ModPartEnum.COMMAND,"%s 's §atalk area set to §e%d§a blocks!§r", "%s§a聊天区域可见消息半径设置为 §e%d §a格!§r", "%s§a聊天區域可見半徑為 §e%d §a格!§r", "%s§6今聊城可知半径置§e%d §6格§r",false),
MESSAGE_CHAT_TALKAREA_PREFERENCE_SET(ChatCommand.TALK_AREA_PREFERENCE_SET, ModPartEnum.COMMAND, "%s 's §atalk area preference set to §e%d§a blocks!§r","%s§a默认聊天区域可见消息半径设置为 §e%d §a格!§r","%s§a默認聊天區域可見訊息半徑設置為 §e%d §a格!§r", "%s§6默置§e %d§6格§r", false),
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),
//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),
// DISABLE_MOVE_CHECK(DisablePlayerMoveCheck.NAME_KEY, ModPartEnum.NAME, "Disable Player Move Check", "禁止检查玩家移动", "禁止檢查玩家移動", false),
TERMINATOR(ModAdvancementKey.LEASH_TERMINATOR.getNameKey(), ModPartEnum.NAME, "The Lead Terminator", "拴绳终结者","拴繩終結者", false),
//GAME_RULE_DESCRIPTION
TELEPORT_WITH_LEASHED_DESCRIPTION(TeleportWithLeashedPlayers.DESCRIPTION_KEY, ModPartEnum.DESCRIPTION, "Holder will teleport with their leashed players ", "传送时将被拴玩家与持有者一起传送", "將被拴玩家將隨持有者一起傳送" ,false),
CREATE_LEASH_FENCE_KNOT_ENTITY_IF_ABSENT_DESCRIPTION(CreateLeashFenceKnotEntityIfAbsent.DESCRIPTION_KEY, ModPartEnum.DESCRIPTION, "Create LeashKnot Entity if it's absent on fence", "如果在栅栏处缺失拴绳结,则创建它", "如果在柵欄処缺失拴繩結,則創建它", false),
KEEP_LEASH_NOT_DROP_TIME_DESCRIPTION(KeepLeashNotDropTime.DESCRIPTION_KEY, ModPartEnum.DESCRIPTION,"The time of Keep new leash which has far distance alive (Tick)", "当距离过远时,保持新建拴绳不掉落的时间 (刻)", "儅距離過遠時,保持其不掉落的時間(刻)", false),
// DISABLE_MOVE_CHECK_DESCRIPTION(DisablePlayerMoveCheck.DESCRIPTION_KEY, ModPartEnum.DESCRIPTION, "Disable the player's movement Check And Correct it.", "禁止检查玩家移动并且纠正它","禁止檢查玩家移動並糾正他它", false),
TERMINATOR_DESC(ModAdvancementKey.LEASH_TERMINATOR.getDescKey(), ModPartEnum.DESCRIPTION, "I am Lead Terminator!", "我來终结拴绳者!", "吾將終結拴繩!", 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),
//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),
@ -78,6 +91,7 @@ public enum ModLangKeyValue {
LEASH_PLAYER(ModAdvancementKey.LEASHED_FRIEND.getNameKey(),ModPartEnum.NAME, "Be bound by Rope", "拴绳链接", "拴繩鏈接" , false),
FOLLOW_ARROW(ModAdvancementKey.FOLLOW_LEASH_ARROW.getNameKey(), ModPartEnum.NAME, "Launch!!!", "启航!!!" , "啓航!!!",false),
FOLLOW_WOLF(ModAdvancementKey.DOG_RUNNING_PLAYER.getNameKey(), ModPartEnum.NAME, "It's Walking human time.", "遛“人”时间", "遛“人”時間",false),
TERMINATOR(ModAdvancementKey.LEASH_TERMINATOR.getNameKey(), ModPartEnum.NAME, "The Lead Terminator", "拴绳终结者","拴繩終結者", false),
NO_LEASH(ModAdvancementKey.NO_LEASH.getNameKey(), ModPartEnum.NAME, "Don't tie me up", "勿拴我", "請恁勿拴唔", false),
//ADV_DESC
LEASH_START_DESC(ModAdvancementKey.LEASH_START.getDescKey(), ModPartEnum.DESCRIPTION, "Journey to becoming a Leash Expert", "拴绳大师之路", "拴繩大師之路", false),
@ -88,6 +102,7 @@ public enum ModLangKeyValue {
FOLLOW_ARROW_DESC(ModAdvancementKey.FOLLOW_LEASH_ARROW.getDescKey(), ModPartEnum.DESCRIPTION, "Mc, what are you talking about in physics?", "抱歉,我的世界不存在物理学" , "抱歉,麦块不講物理學",false),
FOLLOW_WOLF_DESC(ModAdvancementKey.DOG_RUNNING_PLAYER.getDescKey(), ModPartEnum.DESCRIPTION, "In the park where dogs are not allowed to be walked, the dog decided to walk the human instead", "公园不能遛狗,于是狗站起来遛人", "公園裏不許遛狗,於是狗站起來遛人",false),
NO_LEASH_DESC(ModAdvancementKey.NO_LEASH.getDescKey(), ModPartEnum.NAME, "You cannot be leashed by ANY", "你不会被任何东西拴住", "恁不會被任何拴住", false),
TERMINATOR_DESC(ModAdvancementKey.LEASH_TERMINATOR.getDescKey(), ModPartEnum.DESCRIPTION, "I am Lead Terminator!", "我來终结拴绳者!", "吾將終結拴繩!", false),
//MOB_EFFECT
NO_LEASH_EFFECT(ModEffectRegister.getEffectKey(ModEffectRegister.NO_LEASH_EFFECT.get()), ModPartEnum.NAME, "No Leash", "禁拴", "禁拴", false),
//POTION
@ -96,6 +111,9 @@ public enum ModLangKeyValue {
NO_LEASH_POTION_LINGERING(ModPotionRegister.getPotionNameKey("no_leash", (char) 1), ModPartEnum.NAME, "Splash No Leash Potion", "滞留型禁拴药水", "滯留型禁拴藥水", false),
//ARROW
NO_LEASH_ARROW(ModPotionRegister.getTippedArrowNameKey("no_leash"), ModPartEnum.ITEM, "Arrow of No Leash", "禁拴之箭", "禁拴之箭", false),
//INFO_MESSAGE
CHAT_NONE_HEARD_YOU(DefaultTalkArea.CHAT_NONE_HEARD_YOU, ModPartEnum.MESSAGE, "Nobody heard your message", "沒有人接收到你的消息", "無人接收到你的訊息", "无人受子问",false),
;
private final Supplier<?> supplier;
private String key;

View File

@ -0,0 +1,109 @@
package com.r3944realms.leashedplayer.mixin.server;
import com.r3944realms.leashedplayer.content.gamerules.GameruleRegistry;
import com.r3944realms.leashedplayer.content.gamerules.Server.DefaultTalkArea;
import com.r3944realms.leashedplayer.modInterface.ServerPlayerCapacity;
import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.ChatType;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.OutgoingChatMessage;
import net.minecraft.network.chat.PlayerChatMessage;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.players.PlayerList;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import javax.annotation.Nullable;
import java.util.function.Predicate;
@Mixin(PlayerList.class)
public abstract class MixinPlayerList {
@Unique
private boolean Lp$HasAnyoneReceivedMessage;
@Unique
private ServerPlayer Lp$PSender;
@Shadow
public abstract MinecraftServer getServer();
@Inject(method = {"broadcastChatMessage(Lnet/minecraft/network/chat/PlayerChatMessage;Ljava/util/function/Predicate;Lnet/minecraft/server/level/ServerPlayer;Lnet/minecraft/network/chat/ChatType$Bound;)V"}, at = {@At("HEAD")})
private void broadcastChatMessageHead(PlayerChatMessage pMessage, Predicate<ServerPlayer> pShouldFilterMessageTo, @Nullable ServerPlayer pSender, ChatType.Bound pBoundChatType, CallbackInfo CallbackInfo){
Lp$HasAnyoneReceivedMessage = false;
Lp$PSender = pSender;
}
@Inject(method = {"broadcastChatMessage(Lnet/minecraft/network/chat/PlayerChatMessage;Ljava/util/function/Predicate;Lnet/minecraft/server/level/ServerPlayer;Lnet/minecraft/network/chat/ChatType$Bound;)V"}, at = {@At("TAIL")})
private void broadcastChatMessageTail(PlayerChatMessage pMessage, Predicate<ServerPlayer> pShouldFilterMessageTo, @Nullable ServerPlayer pSender, ChatType.Bound pBoundChatType, CallbackInfo CallbackInfo){
ServerPlayerCapacity sSenderPlayer = (ServerPlayerCapacity) pSender;
if (sSenderPlayer != null && (this.Lp$HasAnyoneReceivedMessage || sSenderPlayer.getTalkArea() == -1)) {
return;
}
if (pSender != null) {
pSender.sendSystemMessage(Component.translatable(DefaultTalkArea.CHAT_NONE_HEARD_YOU).withStyle(ChatFormatting.RED), true);
}
}
@Redirect(
method = {"broadcastChatMessage(Lnet/minecraft/network/chat/PlayerChatMessage;Ljava/util/function/Predicate;Lnet/minecraft/server/level/ServerPlayer;Lnet/minecraft/network/chat/ChatType$Bound;)V"},
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/server/level/ServerPlayer;sendChatMessage(Lnet/minecraft/network/chat/OutgoingChatMessage;ZLnet/minecraft/network/chat/ChatType$Bound;)V"
)
)
public void MixinSendChatMessage(ServerPlayer pReceiver, OutgoingChatMessage pMessage, boolean pFiltered, ChatType.Bound pBoundType) {
boolean InRangeHasReceiver = false;
if(Lp$PSender == null) {
pReceiver.sendChatMessage(pMessage, true, pBoundType);
return;
}
int SenderEffectiveTalkArea = Lp$GetEffectiveTalkArea(Lp$PSender),
ReceiverEffectiveTalkArea = Lp$GetEffectiveTalkArea(pReceiver);
if(pReceiver.level() != Lp$PSender.level()) {
// Players are in different worlds
// 接收者与发送者不在同一个维度
if(SenderEffectiveTalkArea > 0 || ReceiverEffectiveTalkArea > 0) {
//But at least one has a non-zero effective talk area
//但有一方有聊天距离设置
return;
}
}
float distance = pReceiver.distanceTo(Lp$PSender);
if(distance > ReceiverEffectiveTalkArea && ReceiverEffectiveTalkArea > 0) {
//Receiver's EffectiveTalkArea is smaller than the distance of both
//接收者设置距离比发送者距离小
return;
}
if(SenderEffectiveTalkArea > 0) {
//Sender's EffectiveTalkArea is non-zero
//发送者距离非零
InRangeHasReceiver = true;
if(distance > SenderEffectiveTalkArea) {
//But too far
//但距离大于它
return;
}
}
if(pReceiver != Lp$PSender) {
//不是同一人能执行到这里就说明有玩家可以被接收到消息
this.Lp$HasAnyoneReceivedMessage = true;
}
if(InRangeHasReceiver) {
PlayerChatMessage message = ((OutgoingChatMessage.Player) pMessage).message();
String content = "§c*§r" + pMessage.content().getString(256 - "§c*§r".length());
PlayerChatMessage playerChatMessage = new PlayerChatMessage(message.link(), message.signature(), message.signedBody(), Component.literal(content), message.filterMask());
pMessage = OutgoingChatMessage.create(playerChatMessage);
}
pReceiver.sendChatMessage(pMessage, pFiltered, pBoundType);
}
@Unique
private static int Lp$GetEffectiveTalkArea(ServerPlayer pPlayer) {
return Math.max(((ServerPlayerCapacity)pPlayer).getTalkArea(), GameruleRegistry.getGameruleIntValue(pPlayer.level(), DefaultTalkArea.ID));
}
}

View File

@ -0,0 +1,84 @@
package com.r3944realms.leashedplayer.mixin.server;
import com.mojang.authlib.GameProfile;
import com.r3944realms.leashedplayer.modInterface.ServerPlayerCapacity;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@SuppressWarnings("AddedMixinMembersNamePattern")
@Mixin(ServerPlayer.class)
public abstract class MixinServerPlayer extends Player implements ServerPlayerCapacity {
@Shadow protected abstract void completeUsingItem();
@Unique
int Lp$TalkArea;
@Unique
int Lp$TalkAreaPreference;
public MixinServerPlayer(Level pLevel, BlockPos pPos, float pYRot, GameProfile pGameProfile) {
super(pLevel, pPos, pYRot, pGameProfile);
}
@Override
public void setTalkArea(int talkArea) {
Lp$TalkArea = talkArea;
}
@Override
public int getTalkArea() {
return Lp$TalkArea;
}
@Override
public void setTalkAreaPreference(int talkAreaPreference) {
Lp$TalkAreaPreference = talkAreaPreference;
}
@Override
public int getTalkAreaPreference() {
return Lp$TalkAreaPreference;
}
@Inject(method = {"tick()V"}, at = {@At("TAIL")})
private void tick(CallbackInfo callbackInfo) {
}
@Inject(method = {"<init>"}, at = {@At("TAIL")})
private void init(CallbackInfo callbackInfo) {
this.Lp$TalkArea = -1;
this.Lp$TalkAreaPreference = -1;
}
/**
* 在玩家死亡后重生时将旧玩家的数据恢复到当前玩家对象上
*/
@Inject(method = {"restoreFrom"}, at = {@At("TAIL")})
private void restoreFrom(ServerPlayer serverPlayer, boolean pKeepEverything, CallbackInfo callbackInfo) {
Lp$TalkArea = ((ServerPlayerCapacity)serverPlayer).getTalkArea();
Lp$TalkAreaPreference = ((ServerPlayerCapacity)serverPlayer).getTalkAreaPreference();
}
@Inject(method = {"readAdditionalSaveData"}, at = {@At("RETURN")})
private void readSaveData(CompoundTag compoundTag, CallbackInfo callbackInfo) {
if(compoundTag.contains("Lp$TalkArea")) {
setTalkArea(compoundTag.getInt("Lp$TalkArea"));
}
if(compoundTag.contains("Lp$TalkAreaPreference")) {
setTalkAreaPreference(compoundTag.getInt("Lp$TalkAreaPreference"));
}
}
@Inject(method = {"addAdditionalSaveData"}, at = {@At("RETURN")})
private void addSaveData(CompoundTag compoundTag, CallbackInfo callbackInfo) {
compoundTag.putInt("Lp$TalkArea", Lp$TalkArea);
compoundTag.putInt("Lp$TalkAreaPreference", Lp$TalkAreaPreference);
}
}

View File

@ -0,0 +1,8 @@
package com.r3944realms.leashedplayer.modInterface;
public interface ServerPlayerCapacity {
void setTalkArea(int talkArea);
int getTalkArea();
void setTalkAreaPreference(int talkAreaPreference);
int getTalkAreaPreference();
}

View File

@ -6,7 +6,9 @@
"both.MixinPlayer",
"item.MixinLeadItem",
"registry.MixinPaintingVariants",
"server.MixinServerGamePacketListenerImpl"
"server.MixinPlayerList",
"server.MixinServerGamePacketListenerImpl",
"server.MixinServerPlayer"
],
"client": [
"client.MixinEntityRenderer",