Merge pull request #6 from 3944Realms/1.21

2024-09-09
This commit is contained in:
3944Realms 2024-09-09 16:50:27 +08:00 committed by GitHub
commit 3918fdb763
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
32 changed files with 583 additions and 43 deletions

View File

@ -1,4 +1,4 @@
# 版本 0.0.3.1-Alpha-2 提前介绍 【注意:本解釋簡繁混寫,因爲趕時間,所以並不怎麽規範,請諒解】
# 版本 0.0.3.4 提前介绍c[最终版本对于0.0.4] 【注意:本解釋簡繁混寫,因爲趕時間,所以並不怎麽規範,請諒解】
## 简介
现在开始你可以用拴绳拴住玩家,也可以拴住自己了,不如尝试拴住彼此来通关我的世界吧(

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=All Rights Reserved
# The mod version. See https://semver.org/
mod_version=0.0.3.1
mod_version=0.0.3.4
# 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

@ -0,0 +1 @@
// 1.21.1 2024-09-08T14:20:00.5319153 Registries

View File

@ -1,2 +1,2 @@
// 1.21.1 2024-09-05T21:38:59.0514122 Languages: en_us for mod: leashedplayer
06d246d0f55a53cc97a63426253e9328cf4a189d assets/leashedplayer/lang/en_us.json
// 1.21.1 2024-09-09T15:57:30.9531898 Languages: en_us for mod: leashedplayer
c51f1722b91e85159f4c60282bf43a1c934b151a assets/leashedplayer/lang/en_us.json

View File

@ -1,2 +1,2 @@
// 1.21.1 2024-09-05T21:38:59.0494103 Languages: zh_cn for mod: leashedplayer
283bed8b7a38bb5927f126c4002a772cd64fc274 assets/leashedplayer/lang/zh_cn.json
// 1.21.1 2024-09-09T16:00:58.2714402 Languages: zh_cn for mod: leashedplayer
bd4d6fe17ea35390bf61a642df42cb2e7bc60beb assets/leashedplayer/lang/zh_cn.json

View File

@ -0,0 +1,7 @@
// 1.21.1 2024-09-09T15:52:23.955795 Advancements
f16184b81ea35a0fbd8f2c49b085a96c32818c69 data/leashedplayer/advancement/dog_running_player.json
bce12ed339b3b0fded263ba039f7a4e6fcfb84ca data/leashedplayer/advancement/follow_arrow.json
29911bbed5a1b7ede2b08d82e6716cd9463bc061 data/leashedplayer/advancement/leashed_friend.json
25f6b476b194a27c0fe0e75d74ac3a7ff4054789 data/leashedplayer/advancement/leashed_self.json
3daef978c8533b3cab963642193faf7181a8f220 data/leashedplayer/advancement/leash_arrow.json
133f844ffafd37b9ba57cafa96350f035cac57f9 data/leashedplayer/advancement/leash_start.json

View File

@ -1,2 +1,2 @@
// 1.21.1 2024-09-05T21:38:59.0474148 Languages: zh_tw for mod: leashedplayer
056a2c46a8ee17f5326e70d397cd3c8b2950df2d assets/leashedplayer/lang/zh_tw.json
// 1.21.1 2024-09-09T16:00:58.2694396 Languages: zh_tw for mod: leashedplayer
ecf1d6cec85b001be6584c37134a76d5d75e65c0 assets/leashedplayer/lang/zh_tw.json

View File

@ -1,8 +1,22 @@
{
"advancement.leashedplayer.dog_running_player": "It's Walking human time.",
"advancement.leashedplayer.dog_running_player.desc": "In the park where dogs are not allowed to be walked, the dog decided to walk the human instead",
"advancement.leashedplayer.follow_arrow": "Launch!!!",
"advancement.leashedplayer.follow_arrow.desc": "Mc, what are you talking about in physics?",
"advancement.leashedplayer.leash_arrow": "Arrow with a Tether?",
"advancement.leashedplayer.leash_arrow.desc": "Maybe you can using it to shoot some mob?",
"advancement.leashedplayer.leash_start": "The Power of Traction",
"advancement.leashedplayer.leash_start.desc": "Journey to becoming a Leash Expert",
"advancement.leashedplayer.leashed_friend": "Bond by Rope",
"advancement.leashedplayer.leashed_friend.desc": "bond player with lead",
"advancement.leashedplayer.leashed_self": "Stable Connection",
"advancement.leashedplayer.leashed_self.desc": "“Restrain oneself with a rope",
"creativetab.leashedplayer.leashedplayer_tab": "Leashed Player",
"entity.leashedplayer.leash_rope_arrow": "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.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",
"gamerule.LP.TeleportWithLeashedPlayers.description": "Holder will teleport with their leashed players ",
"item.leash_rope_arrow.description": "Arrows with ropes attached?",

View File

@ -1,8 +1,22 @@
{
"advancement.leashedplayer.dog_running_player": "遛“人”时间",
"advancement.leashedplayer.dog_running_player.desc": "公园不能遛狗,于是狗站起来遛人",
"advancement.leashedplayer.follow_arrow": "启航!!!",
"advancement.leashedplayer.follow_arrow.desc": "抱歉,我的世界不存在物理学",
"advancement.leashedplayer.leash_arrow": "拴绳之箭?",
"advancement.leashedplayer.leash_arrow.desc": "也许可以用它来发射生物?",
"advancement.leashedplayer.leash_start": "牵引之力",
"advancement.leashedplayer.leash_start.desc": "拴绳大师之路",
"advancement.leashedplayer.leashed_friend": "拴绳链接",
"advancement.leashedplayer.leashed_friend.desc": "用拴绳链接玩家",
"advancement.leashedplayer.leashed_self": "稳固联结",
"advancement.leashedplayer.leashed_self.desc": "用拴绳拴住自己",
"creativetab.leashedplayer.leashedplayer_tab": "可拴玩家",
"entity.leashedplayer.leash_rope_arrow": "拴绳箭",
"gamerule.LP.CreateLeashFenceKnotEntityIfAbsent": "如果缺失则创建拴绳结",
"gamerule.LP.CreateLeashFenceKnotEntityIfAbsent.description": "如果在栅栏处缺失拴绳结,则创建它",
"gamerule.LP.KeepLeashNotDropTime": "保持拴绳不掉落的时间",
"gamerule.LP.KeepLeashNotDropTime.description": "当距离过远时,保持新建拴绳不掉落的时间 (刻)",
"gamerule.LP.TeleportWithLeashedPlayers": "被拴玩家随玩家持有者传送",
"gamerule.LP.TeleportWithLeashedPlayers.description": "传送时将被拴玩家与持有者一起传送",
"item.leash_rope_arrow.description": "带有拴绳的箭矢?",

View File

@ -1,8 +1,22 @@
{
"advancement.leashedplayer.dog_running_player": "遛“人”時間",
"advancement.leashedplayer.dog_running_player.desc": "公園裏不許遛狗,於是狗站起來遛人",
"advancement.leashedplayer.follow_arrow": "啓航!!!",
"advancement.leashedplayer.follow_arrow.desc": "抱歉,麦块不講物理學",
"advancement.leashedplayer.leash_arrow": "拴繩之箭?",
"advancement.leashedplayer.leash_arrow.desc": "也許可以用它發射生物?",
"advancement.leashedplayer.leash_start": "牽引之力",
"advancement.leashedplayer.leash_start.desc": "拴繩大師之路",
"advancement.leashedplayer.leashed_friend": "拴繩鏈接",
"advancement.leashedplayer.leashed_friend.desc": "用拴繩鏈接玩家",
"advancement.leashedplayer.leashed_self": "穩固聯結",
"advancement.leashedplayer.leashed_self.desc": "用栓繩拴住自己",
"creativetab.leashedplayer.leashedplayer_tab": "可拴玩家",
"entity.leashedplayer.leash_rope_arrow": "拴繩箭",
"gamerule.LP.CreateLeashFenceKnotEntityIfAbsent": "如果缺失則創建拴繩結",
"gamerule.LP.CreateLeashFenceKnotEntityIfAbsent.description": "如果在柵欄処缺失拴繩結,則創建它",
"gamerule.LP.KeepLeashNotDropTime": "保持其不掉落的時間",
"gamerule.LP.KeepLeashNotDropTime.description": "儅距離過遠時,保持其不掉落的時間(刻)",
"gamerule.LP.TeleportWithLeashedPlayers": "被拴玩家随玩家持有者傳送",
"gamerule.LP.TeleportWithLeashedPlayers.description": "將被拴玩家將隨持有者一起傳送",
"item.leash_rope_arrow.description": "帶有拴繩的箭矢?",

View File

@ -0,0 +1,33 @@
{
"parent": "leashedplayer:leash_arrow",
"criteria": {
"leash_by_wo_do": {
"conditions": {
"holder": {
"type": "minecraft:wolf"
}
},
"trigger": "leashedplayer:leash_player"
}
},
"display": {
"description": {
"translate": "advancement.leashedplayer.dog_running_player.desc"
},
"frame": "challenge",
"hidden": true,
"icon": {
"count": 1,
"id": "minecraft:bone"
},
"title": {
"translate": "advancement.leashedplayer.dog_running_player"
}
},
"requirements": [
[
"leash_by_wo_do"
]
],
"sends_telemetry_event": true
}

View File

@ -0,0 +1,33 @@
{
"parent": "leashedplayer:leash_arrow",
"criteria": {
"leash_arrow": {
"conditions": {
"holder": {
"type": "leashedplayer:leash_rope_arrow"
}
},
"trigger": "leashedplayer:leash_player"
}
},
"display": {
"announce_to_chat": false,
"description": {
"translate": "advancement.leashedplayer.follow_arrow.desc"
},
"hidden": true,
"icon": {
"count": 1,
"id": "leashedplayer:leash_rope_arrow"
},
"title": {
"translate": "advancement.leashedplayer.follow_arrow"
}
},
"requirements": [
[
"leash_arrow"
]
],
"sends_telemetry_event": true
}

View File

@ -0,0 +1,35 @@
{
"parent": "leashedplayer:leash_start",
"criteria": {
"has_leash_rope_item": {
"conditions": {
"items": [
{
"items": "leashedplayer:leash_rope_arrow"
}
]
},
"trigger": "minecraft:inventory_changed"
}
},
"display": {
"announce_to_chat": false,
"description": {
"translate": "advancement.leashedplayer.leashed_friend.desc"
},
"hidden": true,
"icon": {
"count": 1,
"id": "leashedplayer:leash_rope_arrow"
},
"title": {
"translate": "advancement.leashedplayer.leash_arrow"
}
},
"requirements": [
[
"has_leash_rope_item"
]
],
"sends_telemetry_event": true
}

View File

@ -0,0 +1,35 @@
{
"criteria": {
"has_leash_rope_item": {
"conditions": {
"items": [
{
"items": "minecraft:lead"
}
]
},
"trigger": "minecraft:inventory_changed"
}
},
"display": {
"announce_to_chat": false,
"background": "leashedplayer:textures/gui/advancements/backgrounds/leashed_player.png",
"description": {
"translate": "advancement.leashedplayer.leash_start.desc"
},
"hidden": true,
"icon": {
"count": 1,
"id": "minecraft:lead"
},
"title": {
"translate": "advancement.leashedplayer.leash_start"
}
},
"requirements": [
[
"has_leash_rope_item"
]
],
"sends_telemetry_event": true
}

View File

@ -0,0 +1,32 @@
{
"parent": "leashedplayer:leash_start",
"criteria": {
"leash_other_player": {
"conditions": {
"holder": {
"type": "minecraft:player"
}
},
"trigger": "leashedplayer:leash_player"
}
},
"display": {
"description": {
"translate": "advancement.leashedplayer.leashed_friend.desc"
},
"hidden": true,
"icon": {
"count": 1,
"id": "minecraft:lead"
},
"title": {
"translate": "advancement.leashedplayer.leashed_friend"
}
},
"requirements": [
[
"leash_other_player"
]
],
"sends_telemetry_event": true
}

View File

@ -0,0 +1,32 @@
{
"parent": "leashedplayer:leash_start",
"criteria": {
"leash_self": {
"conditions": {
"holder": {
"type": "minecraft:leash_knot"
}
},
"trigger": "leashedplayer:leash_player"
}
},
"display": {
"description": {
"translate": "advancement.leashedplayer.leashed_self.desc"
},
"hidden": true,
"icon": {
"count": 1,
"id": "minecraft:player_head"
},
"title": {
"translate": "advancement.leashedplayer.leashed_self"
}
},
"requirements": [
[
"leash_self"
]
],
"sends_telemetry_event": true
}

View File

@ -1,6 +1,7 @@
package com.r3944realms.leashedplayer;
import com.r3944realms.leashedplayer.config.LeashPlayerCommonConfig;
import com.r3944realms.leashedplayer.content.criteriaTriggers.ModCriteriaTriggers;
import com.r3944realms.leashedplayer.content.entities.ModEntityRegister;
import com.r3944realms.leashedplayer.content.items.ModCreativeTab;
import com.r3944realms.leashedplayer.content.items.ModItemRegister;
@ -14,12 +15,13 @@ import static com.r3944realms.leashedplayer.utils.Logger.logger;
@Mod(LeashedPlayer.MOD_ID)
public class LeashedPlayer {
public static final String MOD_ID = "leashedplayer";
private static Float M1;//拴繩掉落距離倍基數
private static Float M2;//繩箭拴繩掉落距離倍基數
private static Double M1;//拴繩掉落距離倍基數
private static Double M2;//繩箭拴繩掉落距離倍基數
public LeashedPlayer(IEventBus event) {
ModItemRegister.register(event);
ModEntityRegister.register(event);
ModCreativeTab.register(event);
ModCriteriaTriggers.register(event);
initiation();
}
private void initiation() {
@ -28,14 +30,13 @@ public class LeashedPlayer {
Util.configFileCreate(new String[]{leashedPlayerCommonConfig});
ModLoadingContext.get().getActiveContainer().registerConfig(ModConfig.Type.COMMON, LeashPlayerCommonConfig.SPEC, MOD_ID + "/" + leashedPlayerCommonConfig + "/LeashPlayer.toml");
}
public static Float M1() {
public static Double M1() {
if(M1 == null) {
M1 = LeashPlayerCommonConfig.TheLeashBreakLengthTimesBase.get();
}
return M1;
}
public static Float M2() {
public static Double M2() {
if(M2 == null) {
M2 = LeashPlayerCommonConfig.TheMultipleThatLeashRopeArrowBreakLength.get();
}

View File

@ -8,29 +8,29 @@ public class LeashPlayerCommonConfig {
public static final ModConfigSpec.ConfigValue<String> LeashedPlayerModCommandPrefix;
public static final ModConfigSpec.BooleanValue EnableLeashPlayerCommandPrefix;
public static ModConfigSpec.IntValue MinimumLeashLengthCanBeSet, MaximumLeashLengthCanBeSet, TheLeashArrowMaxLifeTime;
public static ModConfigSpec.ConfigValue<Float> TheMultipleThatLeashRopeArrowBreakLength, TheLeashBreakLengthTimesBase;
public static ModConfigSpec.DoubleValue TheMultipleThatLeashRopeArrowBreakLength, TheLeashBreakLengthTimesBase;
static {
BUILDER.comment("Leash Player Config");
BUILDER.comment("Leash Player Command");
BUILDER.push("Command");
EnableLeashPlayerCommandPrefix = BUILDER.comment("The prefix of this mod's commands"," [ Default: true] ").define("Enable Leash Player Command", true);
LeashedPlayerModCommandPrefix = BUILDER.comment("The prefix of this mod's commands"," [ Default:'lp'] ").define("LeashedPlayerModCommandPrefix", "lp");
EnableLeashPlayerCommandPrefix = BUILDER.comment("The prefix of this mod's commands"," [ Default: true] ").define("EnableLeashPlayerCommand", true);
LeashedPlayerModCommandPrefix = BUILDER.comment("The prefix of this mod's commands"," [ Default:'lp'] ").define("LeashedPlayerModCommandPrefix", "lp");
BUILDER.pop();
BUILDER.push("Leash Rope Arrow");
TheMultipleThatLeashRopeArrowBreakLength = BUILDER.comment("How many times is the length of the arrow rope based on BreakLength TimeBase", "[ Default : 5.0f, Invalid Range:[1.0f, 10.0f] ]").define("TheMultipleArrowBreak", 5.0f, o -> (o instanceof Float f) && f >= 2.0f && f <= 10.0f);
TheLeashArrowMaxLifeTime = BUILDER.comment("If the LeashArrowEntity's life is bigger than this value ,it will be discrad", "[ Default : 2400, Invalid Range:[1200 , 10240]").defineInRange("TheLeashArrowMaxLifeTime",2400, 1200, 10240);
BUILDER.comment("Leash Player Arrow");
BUILDER.push("LeashRopeArrow");
TheMultipleThatLeashRopeArrowBreakLength = BUILDER.comment("How many times is the length of the arrow rope based on BreakLength TimeBase", "[ Default : 5.0f, Invalid Range:[2.0f, 10.0f] ]").defineInRange("TheMultipleArrowBreak", 5.0f, 2.0f , 10.0f);
TheLeashArrowMaxLifeTime = BUILDER.comment("If the LeashArrowEntity's life is bigger than this value ,it will be discarded", "[ Default : 2400, Invalid Range:[1200 , 10240]]").defineInRange("TheLeashArrowMaxLifeTime",2400, 1200, 10240);
BUILDER.pop();
BUILDER.comment("Leash Player Misc");
BUILDER.push("Misc");
BUILDER.push("LeashLength");
TheLeashBreakLengthTimesBase = BUILDER.comment("When it exceeds how many times, the leash will drop","[ Default:2.0f, Invalid Range:[2.0f, 5.0f] ]").define("BreakLengthTimeBase", 2.0f, o -> (o instanceof Float f) && f >= 2.0f && f <= 5.0f);
MinimumLeashLengthCanBeSet = BUILDER.comment("The minimum integer's length of Leash", "[ Default:5, Invalid Range:[2,10] ]").defineInRange("MinLeashLength", 5, 2, 10);
MaximumLeashLengthCanBeSet = BUILDER.comment("The maximum integer's length of Leash", "[ Default:1024, Invalid Range:[32, 1024] ]").defineInRange("MaxLeashLength", 1024, 32, 1024);
BUILDER.comment("Leash Player Length");
BUILDER.push("LeashLength");
TheLeashBreakLengthTimesBase = BUILDER.comment("When it exceeds how many times, the leash will drop"," [ Default:2.0f, Invalid Range:[2.0f, 5.0f] ]").defineInRange("BreakLengthTimeBase", 2.0f, 2.0f ,5.0f);
MinimumLeashLengthCanBeSet = BUILDER.comment("The minimum integer's length of Leash", " [ Default:5, Invalid Range:[2,10] ]").defineInRange("MinLeashLength", 5, 2, 10);
MaximumLeashLengthCanBeSet = BUILDER.comment("The maximum integer's length of Leash", " [ Default:1024, Invalid Range:[32, 1024] ]").defineInRange("MaxLeashLength", 1024, 32, 1024);
BUILDER.pop().pop();

View File

@ -340,11 +340,11 @@ public class LeashCommand {
)
)
)
.then(Commands.argument("targetPlayers", EntityArgument.players()).executes(getRefPlayerLeashLength)
.then(Commands.literal("get").executes(getRefPlayerLeashLength))
.then(Commands.argument("targetPlayers", EntityArgument.players()).executes(getRefPlayersLeashLength)
.then(Commands.literal("get").executes(getRefPlayersLeashLength))
.then(Commands.literal("set").requires(cs -> cs.hasPermission(2))
.then(
Commands.argument("leashLength", FloatArgumentType.floatArg(MIN_VALUE, MAX_VALUE)).executes(setRefPlayerLengthLeashLength)
Commands.argument("leashLength", FloatArgumentType.floatArg(MIN_VALUE, MAX_VALUE)).executes(setRefPlayersLengthLeashLength)
)
)
)
@ -368,7 +368,7 @@ public class LeashCommand {
)
.then(Commands.argument("targetPlayers", EntityArgument.players()).executes(getRefPlayersLeashData)
.then(Commands.literal("get")
.executes(getRefPlayerLeashData)
.executes(getRefPlayersLeashData)
)
.then(Commands.literal("set").requires(cs -> cs.hasPermission(2))
.then(Commands.argument("holderEntity", EntityArgument.entity())

View File

@ -0,0 +1,47 @@
package com.r3944realms.leashedplayer.content.criteriaTriggers;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import com.r3944realms.leashedplayer.modInterface.PlayerLeashable;
import net.minecraft.advancements.Criterion;
import net.minecraft.advancements.critereon.ContextAwarePredicate;
import net.minecraft.advancements.critereon.EntityPredicate;
import net.minecraft.advancements.critereon.SimpleCriterionTrigger;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.Entity;
import org.jetbrains.annotations.NotNull;
import java.util.Optional;
public class LeashPlayerTrigger extends SimpleCriterionTrigger<LeashPlayerTrigger.TriggerInstance> {
@Override
public @NotNull Codec<TriggerInstance> codec() {
return TriggerInstance.CODEC;
}
public void trigger(ServerPlayer pPlayer, Entity pHolderEntity) {
this.trigger(pPlayer, pl -> pl.matches(pPlayer, pHolderEntity));
}
public record TriggerInstance(Optional<ContextAwarePredicate> player, Optional<EntityPredicate> holder) implements SimpleCriterionTrigger.SimpleInstance {
public static final Codec<TriggerInstance> CODEC =
RecordCodecBuilder.create(instance ->
instance.group(
EntityPredicate.ADVANCEMENT_CODEC.optionalFieldOf("player").forGetter(TriggerInstance::player),
EntityPredicate.CODEC.optionalFieldOf("holder").forGetter(TriggerInstance::holder)
)
.apply(instance, TriggerInstance::new));
// public static Criterion<TriggerInstance> LeashSelf() {
// return ModCriteriaTriggers.LEASH_PLAYER_TRIGGER.get().createCriterion(new TriggerInstance(Optional.empty(), Optional.empty()));
// }
public static Criterion<TriggerInstance> LeashPlayer(EntityPredicate.Builder holder) {
return ModCriteriaTriggers.LEASH_PLAYER_TRIGGER.get().createCriterion(new TriggerInstance(Optional.empty(), Optional.of(holder.build())));
}
public boolean matches(ServerPlayer player, Entity holder) {
PlayerLeashable ppl = (PlayerLeashable) player;
return ppl.isLeashed() && holder.equals(PlayerLeashable.getLeashDataEntity(player, player.serverLevel())) && this.holder.isPresent() && this.holder.get().matches(player, holder);
}
}
}

View File

@ -0,0 +1,17 @@
package com.r3944realms.leashedplayer.content.criteriaTriggers;
import com.r3944realms.leashedplayer.LeashedPlayer;
import net.minecraft.advancements.CriterionTrigger;
import net.minecraft.core.registries.Registries;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.neoforge.registries.DeferredHolder;
import net.neoforged.neoforge.registries.DeferredRegister;
public class ModCriteriaTriggers {
public static final DeferredRegister<CriterionTrigger<?>> TRIGGERS = DeferredRegister.create(Registries.TRIGGER_TYPE, LeashedPlayer.MOD_ID);
public static final DeferredHolder<CriterionTrigger<?>, LeashPlayerTrigger> LEASH_PLAYER_TRIGGER =
TRIGGERS.register("leash_player", LeashPlayerTrigger::new);
public static void register(IEventBus eventBus) {
TRIGGERS.register(eventBus);
}
}

View File

@ -0,0 +1,38 @@
package com.r3944realms.leashedplayer.datagen.LanguageAndOtherData;
import com.r3944realms.leashedplayer.LeashedPlayer;
import javax.annotation.Nullable;
public enum ModAdvancementKey {
LEASH_START("leash_start", null),
LEASHED_FRIEND("leashed_friend", LEASH_START),
LEASHED_SELF("leashed_self", LEASH_START),
LEASH_ARROW("leash_arrow", LEASH_START),
FOLLOW_LEASH_ARROW("follow_arrow", LEASH_ARROW),
DOG_RUNNING_PLAYER("dog_running_player", LEASH_ARROW),
;
private final String Name;
@Nullable
private final ModAdvancementKey Parent;
ModAdvancementKey(String name, @Nullable ModAdvancementKey parent) {
this.Name = name;
this.Parent = parent;
}
public @Nullable ModAdvancementKey getParent() {
return Parent;
}
public String getNameKey() {
return "advancement." + LeashedPlayer.MOD_ID + "." + Name;
}
public String getDescKey() {
return this.getNameKey() + ".desc";
}
public String getNameWithNameSpace() {
return LeashedPlayer.MOD_ID + ":" + this.Name;
}
}

View File

@ -49,6 +49,20 @@ public enum ModLangKeyValue {
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),
//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),
LEASH_SELF(ModAdvancementKey.LEASHED_SELF.getNameKey(), ModPartEnum.NAME, "Stable Connection", "稳固联结" ,"穩固聯結", false),
LEASH_PLAYER(ModAdvancementKey.LEASHED_FRIEND.getNameKey(),ModPartEnum.NAME, "Bond 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),
//ADV_DESC
LEASH_START_DESC(ModAdvancementKey.LEASH_START.getDescKey(), ModPartEnum.DESCRIPTION, "Journey to becoming a Leash Expert", "拴绳大师之路", "拴繩大師之路", false),
LEASH_LR_ARROW_DESC(ModAdvancementKey.LEASH_ARROW.getDescKey(), ModPartEnum.DESCRIPTION, "Maybe you can using it to shoot some mob?", "也许可以用它来发射生物?", "也許可以用它發射生物?", false),
LEASH_SELF_DESC(ModAdvancementKey.LEASHED_SELF.getDescKey(), ModPartEnum.DESCRIPTION, "“Restrain oneself with a rope", "用拴绳拴住自己" ,"用栓繩拴住自己", false),
LEASH_PLAYER_DESC(ModAdvancementKey.LEASHED_FRIEND.getDescKey(),ModPartEnum.DESCRIPTION, "bond player with lead", "用拴绳链接玩家", "用拴繩鏈接玩家", false),
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),
;
private final Supplier<?> supplier;
private String key;

View File

@ -16,19 +16,21 @@ import java.util.concurrent.CompletableFuture;
public class ModDataGeneratorHandler {
@SubscribeEvent
public static void genData(GatherDataEvent event) {
CompletableFuture<HolderLookup.Provider> HolderFolder = event.getLookupProvider();
CompletableFuture<HolderLookup.Provider> holderFolder = event.getLookupProvider();
ExistingFileHelper existingFileHelper = event.getExistingFileHelper();
/*Language Provider ENGLISH CHINESE(SIM/TRA)*/
addLanguage(event, LanguageEnum.English, "en_us");
addLanguage(event, LanguageEnum.SimpleChinese, "zh_cn");
addLanguage(event, LanguageEnum.TraditionalChinese, "zh_tw");
addLanguage(event, LanguageEnum.LiteraryChinese, "lzh");
addLanguage(event, LanguageEnum.English);
addLanguage(event, LanguageEnum.SimpleChinese);
addLanguage(event, LanguageEnum.TraditionalChinese);
addLanguage(event, LanguageEnum.LiteraryChinese);
ModDataPackBuiltInEntriesProvider(event, holderFolder);
ItemModelGenerator(event, existingFileHelper);
RecipeGenerator(event, HolderFolder);
RecipeGenerator(event, holderFolder);
ModTagsProvider(event, event.getLookupProvider(), existingFileHelper);
ModAdvancementProvider(event, holderFolder, existingFileHelper);
}
private static void addLanguage(GatherDataEvent event, LanguageEnum language, String lan_regex){
private static void addLanguage(GatherDataEvent event, LanguageEnum language){
event.getGenerator().addProvider(
event.includeClient(),
(DataProvider.Factory<ModLanguageProvider>) pOutput -> new ModLanguageProvider(pOutput, LeashedPlayer.MOD_ID, language)
@ -58,4 +60,16 @@ public class ModDataGeneratorHandler {
new ModItemTagProvider(pOutput, completableFuture, modBlockTagProvider.contentsGetter(), helper)
);
}
private static void ModDataPackBuiltInEntriesProvider(GatherDataEvent event, CompletableFuture<HolderLookup.Provider> future) {
event.getGenerator().addProvider(
event.includeServer(),
(DataProvider.Factory<ModDataPackBuiltInEntriesProvider>) pOutput -> new ModDataPackBuiltInEntriesProvider(pOutput, future)
);
}private static void ModAdvancementProvider(GatherDataEvent event, CompletableFuture<HolderLookup.Provider> pLookUpProvider, ExistingFileHelper helper) {
event.getGenerator().addProvider(
event.includeServer(),
(DataProvider.Factory<ModAdvancementProvider>) pOutput -> new ModAdvancementProvider(pOutput, pLookUpProvider, helper));
}
}

View File

@ -0,0 +1,112 @@
package com.r3944realms.leashedplayer.datagen.generator;
import com.r3944realms.leashedplayer.LeashedPlayer;
import com.r3944realms.leashedplayer.content.criteriaTriggers.LeashPlayerTrigger;
import com.r3944realms.leashedplayer.content.entities.ModEntityRegister;
import com.r3944realms.leashedplayer.content.items.ModItemRegister;
import com.r3944realms.leashedplayer.datagen.LanguageAndOtherData.ModAdvancementKey;
import net.minecraft.advancements.Advancement;
import net.minecraft.advancements.AdvancementHolder;
import net.minecraft.advancements.AdvancementType;
import net.minecraft.advancements.critereon.EntityPredicate;
import net.minecraft.advancements.critereon.EntityTypePredicate;
import net.minecraft.advancements.critereon.InventoryChangeTrigger;
import net.minecraft.core.HolderLookup;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.item.Items;
import net.neoforged.neoforge.common.data.AdvancementProvider;
import net.neoforged.neoforge.common.data.ExistingFileHelper;
import org.jetbrains.annotations.NotNull;
import java.util.function.Consumer;
public class ModAdvancementGenerator implements AdvancementProvider.AdvancementGenerator {
private final ResourceLocation ADV_BG = ResourceLocation.fromNamespaceAndPath(LeashedPlayer.MOD_ID, "textures/gui/advancements/backgrounds/leashed_player.png");
@Override
public void generate(HolderLookup.@NotNull Provider registries, @NotNull Consumer<AdvancementHolder> saver, @NotNull ExistingFileHelper existingFileHelper) {
AdvancementHolder hasLeashRopeItem = Advancement.Builder.advancement().display(
Items.LEAD,
Component.translatable(ModAdvancementKey.LEASH_START.getNameKey()),
Component.translatable(ModAdvancementKey.LEASH_START.getDescKey()),
ADV_BG,
AdvancementType.TASK,
true,
false,
true
).addCriterion("has_leash_rope_item", InventoryChangeTrigger.TriggerInstance.hasItems(Items.LEAD))
.save(saver, ModAdvancementKey.LEASH_START.getNameWithNameSpace());
AdvancementHolder hasLeashRopeArrow = Advancement.Builder.advancement().display(
ModItemRegister.LEASH_ROPE_ARROW.get(),
Component.translatable(ModAdvancementKey.LEASH_ARROW.getNameKey()),
Component.translatable(ModAdvancementKey.LEASHED_FRIEND.getDescKey()),
null,
AdvancementType.TASK,
true,
false,
true
).addCriterion("has_leash_rope_item", InventoryChangeTrigger.TriggerInstance.hasItems(ModItemRegister.LEASH_ROPE_ARROW.get()))
.parent(hasLeashRopeItem)
.save(saver, ModAdvancementKey.LEASH_ARROW.getNameWithNameSpace());
AdvancementHolder leashedMySelf = Advancement.Builder.advancement().display(
Items.PLAYER_HEAD,
Component.translatable(ModAdvancementKey.LEASHED_SELF.getNameKey()),
Component.translatable(ModAdvancementKey.LEASHED_SELF.getDescKey()),
null,
AdvancementType.TASK,
true,
true,
true
).addCriterion("leash_self", LeashPlayerTrigger.TriggerInstance.LeashPlayer(
EntityPredicate.Builder.entity().entityType(EntityTypePredicate.of(EntityType.LEASH_KNOT))
))
.parent(hasLeashRopeItem).save(saver, ModAdvancementKey.LEASHED_SELF.getNameWithNameSpace());
AdvancementHolder followLeashRopeArrow = Advancement.Builder.advancement().display(
ModItemRegister.LEASH_ROPE_ARROW.get(),
Component.translatable(ModAdvancementKey.FOLLOW_LEASH_ARROW.getNameKey()),
Component.translatable(ModAdvancementKey.FOLLOW_LEASH_ARROW.getDescKey()),
null,
AdvancementType.TASK,
true,
false,
true
).addCriterion("leash_arrow", LeashPlayerTrigger.TriggerInstance.LeashPlayer(
EntityPredicate.Builder.entity().entityType(EntityTypePredicate.of(ModEntityRegister.LEASH_ROPE_ARROW.get()))
))
.parent(hasLeashRopeArrow)
.save(saver, ModAdvancementKey.FOLLOW_LEASH_ARROW.getNameWithNameSpace());
AdvancementHolder dogRunPlayer = Advancement.Builder.advancement().display(
Items.BONE,
Component.translatable(ModAdvancementKey.DOG_RUNNING_PLAYER.getNameKey()),
Component.translatable(ModAdvancementKey.DOG_RUNNING_PLAYER.getDescKey()),
null,
AdvancementType.CHALLENGE,
true,
true,
true
).addCriterion("leash_by_wo_do", LeashPlayerTrigger.TriggerInstance.LeashPlayer(
EntityPredicate.Builder.entity().entityType(EntityTypePredicate.of(EntityType.WOLF))
))
.parent(hasLeashRopeArrow).save(saver, ModAdvancementKey.DOG_RUNNING_PLAYER.getNameWithNameSpace());
AdvancementHolder leashedOther = Advancement.Builder.advancement().display(
Items.LEAD,
Component.translatable(ModAdvancementKey.LEASHED_FRIEND.getNameKey()),
Component.translatable(ModAdvancementKey.LEASHED_FRIEND.getDescKey()),
null,
AdvancementType.TASK,
true,
true,
true
).addCriterion("leash_other_player",
LeashPlayerTrigger.TriggerInstance.LeashPlayer(
EntityPredicate.Builder.entity().entityType(EntityTypePredicate.of(EntityType.PLAYER))
)
)
.parent(hasLeashRopeItem).save(saver, ModAdvancementKey.LEASHED_FRIEND.getNameWithNameSpace());
}
}

View File

@ -0,0 +1,24 @@
package com.r3944realms.leashedplayer.datagen.provider;
import com.r3944realms.leashedplayer.datagen.generator.ModAdvancementGenerator;
import net.minecraft.core.HolderLookup;
import net.minecraft.data.PackOutput;
import net.neoforged.neoforge.common.data.AdvancementProvider;
import net.neoforged.neoforge.common.data.ExistingFileHelper;
import java.util.List;
import java.util.concurrent.CompletableFuture;
public class ModAdvancementProvider extends AdvancementProvider {
/**
* Constructs an advancement provider using the generators to write the
* advancements to a file.
*
* @param output the target directory of the data generator
* @param registries a future of a lookup for registries and their objects
* @param existingFileHelper a helper used to find whether a file exists
*/
public ModAdvancementProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> registries, ExistingFileHelper existingFileHelper) {
super(output, registries, existingFileHelper, List.of(new ModAdvancementGenerator()));
}
}

View File

@ -0,0 +1,19 @@
package com.r3944realms.leashedplayer.datagen.provider;
import com.r3944realms.leashedplayer.LeashedPlayer;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.RegistrySetBuilder;
import net.minecraft.data.PackOutput;
import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
public class ModDataPackBuiltInEntriesProvider extends DatapackBuiltinEntriesProvider {
public static final RegistrySetBuilder BUILDER = new RegistrySetBuilder()
;
public ModDataPackBuiltInEntriesProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> registries) {
super(output, registries, BUILDER, Set.of(LeashedPlayer.MOD_ID));
CompletableFuture<HolderLookup.Provider> registryProvider = getRegistryProvider();
}
}

View File

@ -158,7 +158,7 @@ public abstract class MixinPlayer extends LivingEntity implements PlayerLeashabl
float leashLengthSelf = iEntityExtension.getLeashLength();
leashLength = leashLengthSelf > LeashCommand.MIN_VALUE ? leashLengthSelf : LeashCommand.MIN_VALUE;
if (entity != null) {
float breakDistanceTime = (entity instanceof LeashRopeArrow) ? LeashedPlayer.M1() * LeashedPlayer.M2() : LeashedPlayer.M1();
double breakDistanceTime = (entity instanceof LeashRopeArrow) ? LeashedPlayer.M1() * LeashedPlayer.M2() : LeashedPlayer.M1();
if(!isAlive() || !entity.isAlive() ||( distanceTo(entity) > Math.max(leashLength * breakDistanceTime, LeashCommand.MIN_VALUE * breakDistanceTime) && keepLeashTick == 0)){
//玩家死亡 持有者不存在 距离大于设定值的 breakDistanceTime 倍且keepTick <=0长度的 breakDistanceTime 倍若低于 LeashCommand.MIN_VALUE 则选 LeashCommand.MIN_VALUE
// 则取消拴绳关系并掉落拴绳

View File

@ -93,7 +93,7 @@ public abstract class MixinLevelRenderer {
if (playerByUUID != null) {
playerRendererExtension.renderLeashForCamera(pCamera, partialTickTime, poseStack, multibuffersource$buffersource, playerByUUID);
} else {
float MaxLeashLength = ((ILivingEntityExtension) abstractClientPlayer).getLeashLength() * LeashedPlayer.M1() * LeashedPlayer.M2();
double MaxLeashLength = ((ILivingEntityExtension) abstractClientPlayer).getLeashLength() * LeashedPlayer.M1() * LeashedPlayer.M2();
List<Entity> entities = level.getEntities(
null,
new AABB(

View File

@ -63,8 +63,8 @@ public abstract class MixinPlayerRenderer extends LivingEntityRenderer<AbstractC
if (playerByUUID != null) {
renderLeash(pEntity, pPartialTicks, pPoseStack, pBuffer, playerByUUID);
} else {
float breakDistanceTime = (leashDataFromEntityData.leashHolder instanceof LeashRopeArrow) ? LeashedPlayer.M1() * LeashedPlayer.M2() : LeashedPlayer.M1();
float MaxLeashLength = ((ILivingEntityExtension) pEntity).getLeashLength() * breakDistanceTime;
double breakDistanceTime = (leashDataFromEntityData.leashHolder instanceof LeashRopeArrow) ? LeashedPlayer.M1() * LeashedPlayer.M2() : LeashedPlayer.M1();
double MaxLeashLength = ((ILivingEntityExtension) pEntity).getLeashLength() * breakDistanceTime;
List<Entity> entities = level.getEntities(
null,
new AABB(

View File

@ -1,5 +1,6 @@
package com.r3944realms.leashedplayer.modInterface;
import com.r3944realms.leashedplayer.content.criteriaTriggers.ModCriteriaTriggers;
import net.minecraft.core.BlockPos;
import net.minecraft.network.protocol.game.ClientboundSetEntityLinkPacket;
import net.minecraft.server.level.ServerLevel;
@ -40,6 +41,9 @@ public interface PlayerLeashable extends Leashable {
*/
default void setLeashedTo(@NotNull Entity pLeashHolder, boolean pBroadcastPacket) {
setLeashedTo((Entity & Leashable)this, pLeashHolder, pBroadcastPacket);
if(this instanceof ServerPlayer){
ModCriteriaTriggers.LEASH_PLAYER_TRIGGER.get().trigger((ServerPlayer) this, pLeashHolder);
}
}
static <E extends Entity & Leashable> void setLeashedTo(E pEntity, Entity pLeashHolder, boolean pBroadcastPacket) {

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 B