Merge pull request #15 from 3944Realms/1.21

2024-10-21
This commit is contained in:
3944Realms 2024-10-21 22:09:10 +08:00 committed by GitHub
commit 40ae2c14e1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
28 changed files with 451 additions and 62 deletions

View File

@ -1,4 +1,4 @@
# 版本 0.0.3.6 提前介绍c[最终版本对于0.0.4] 【注意:本解釋簡繁混寫,因爲趕時間,所以並不怎麽規範,請諒解】
# 版本 0.0.3.8 提前介绍c[最终版本对于0.0.4] 【注意:本解釋簡繁混寫,因爲趕時間,所以並不怎麽規範,請諒解】
## 简介
现在开始你可以用拴绳拴住玩家,也可以拴住自己了,不如尝试拴住彼此来通关我的世界吧(
@ -15,7 +15,7 @@
4. 拴绳箭最大存活时间
## 新物品 和 实体
### 拴绳箭
### 拴绳箭 [有普通和荧光两种箭矢]
获得飞一样的感觉(操作不当可能会摔死
#### 射中实体时会将射击者拴绳绑定在改实体上该实体父类必须是有LivingEntity类型同时拴绳箭会以普通的箭矢掉落
#### 射中栅栏时,会自动将玩家拴在上面 ,同时拴绳箭会以普通的箭矢掉落
@ -32,6 +32,7 @@
* `/lp leash clear [<玩家[可多个对象]>] ` - 清除該玩家的的拴繩數據實體 [ 如果<玩家>为空则代表执行对象是自己 ]
* `/lp motion [<实体[可多个对象]>] add/set/multiply <x> <y> <z>` - 给实体添加/设置/倍乘 加速度
## 游戏规则

View File

@ -72,7 +72,7 @@ runs {
data {
// example of overriding the workingDirectory set in configureEach above, uncomment if you want to use it
// workingDirectory project.file('run-data')
systemProperty('gradle.task', 'runData')
// Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources.
programArguments.addAll '--mod', project.mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath()
}

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.7
mod_version=0.0.3.8
# 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 +1,2 @@
// 1.21.1 2024-09-08T14:20:00.5319153 Registries
// 1.21.1 2024-10-21T20:49:37.2148772 Registries
6f79a674215db9f9d2820b1c7f052c60ce729fee data/leashedplayer/painting_variant/group_photo.json

View File

@ -1,2 +1,2 @@
// 1.21.1 2024-10-05T22:32:01.8406652 Languages: en_us for mod: leashedplayer
27fb1feca9c95470e67902e0a5287fa717f71137 assets/leashedplayer/lang/en_us.json
// 1.21.1 2024-10-21T20:49:37.2158765 Languages: en_us for mod: leashedplayer
dc78768edb63e137acf5074f92a68563e1b28406 assets/leashedplayer/lang/en_us.json

View File

@ -1,2 +1,2 @@
// 1.21.1 2024-10-05T22:32:01.8406652 Languages: zh_cn for mod: leashedplayer
cf1999519d9de039d6a7d3e6f241f67b68c968ed assets/leashedplayer/lang/zh_cn.json
// 1.21.1 2024-10-21T20:49:37.2148772 Languages: zh_cn for mod: leashedplayer
6bf33a9eeda115951df58977924696be03f6f1bf assets/leashedplayer/lang/zh_cn.json

View File

@ -1,2 +1,2 @@
// 1.21.1 2024-10-05T22:32:01.8406652 Languages: zh_tw for mod: leashedplayer
8d4b3e4d8f0513352a7ef4e1373be64f4d77f9cd assets/leashedplayer/lang/zh_tw.json
// 1.21.1 2024-10-21T20:49:37.2138769 Languages: zh_tw for mod: leashedplayer
d44d60e27eacfee6c34a8b9a5fcdd164f25cb5a5 assets/leashedplayer/lang/zh_tw.json

View File

@ -37,5 +37,10 @@
"leashedplayer.command.leash.message.leash.data.show": "%1$s's LeashDataEntity is %2$s",
"leashedplayer.command.leash.message.leash.length.failed": "Failed (Internal Error, maybe your command is incorrect)",
"leashedplayer.command.leash.message.leash.length.set": "The Leash length of %1$s is set to %2$s blocks",
"leashedplayer.command.leash.message.leash.length.show": "The Leash Length of %1$s is %2$s blocks"
"leashedplayer.command.leash.message.leash.length.show": "The Leash Length of %1$s is %2$s blocks",
"leashedplayer.command.motion.message.adder.successful": "§bAdd Successfully.§a%s§7:§f[§eVec§7: §a(§f%f§7,§f%f§7,§f%f§a)§f]§r",
"leashedplayer.command.motion.message.multiply.successful": "§bMultiply Successfully.§a%s§7:§f[§eVec§7: §a(§f%f§7,§f%f§7,§f%f§a)§f]§r",
"leashedplayer.command.motion.message.setter.successful": "§bSet Successfully.§a%s§7:§f[§eVec§7: §a(§f%f§7,§f%f§7,§f%f§a)§f]§r",
"painting.leashedplayer.group_photo.author": "§9Leisure §4Time §eDock§r",
"painting.leashedplayer.group_photo.title": "§dGroup Photo §7[§6memorable§7]§r"
}

View File

@ -37,5 +37,10 @@
"leashedplayer.command.leash.message.leash.data.show": "%1$s的拴绳数据实体为%2$s",
"leashedplayer.command.leash.message.leash.length.failed": "失败(内部错误,可能是你输的指令有误)",
"leashedplayer.command.leash.message.leash.length.set": "%1$s的拴绳长度被设置为%2$s格",
"leashedplayer.command.leash.message.leash.length.show": "%1$s的拴绳长度为%2$s格"
"leashedplayer.command.leash.message.leash.length.show": "%1$s的拴绳长度为%2$s格",
"leashedplayer.command.motion.message.adder.successful": "§b添加成功.§a%s§7:§f[§e加速度§7:§a(§f%f§7,§f%f§7,§f%f§a)§f]§r",
"leashedplayer.command.motion.message.multiply.successful": "§b倍乘成功.§a%s§7:§f[§e加速度§7:§a(§f%f§7,§f%f§7,§f%f§a)§f]§r",
"leashedplayer.command.motion.message.setter.successful": "§b设置成功.§a%s§7:§f[§e加速度§7:§a(§f%f§7,§f%f§7,§f%f§a)§f]§r",
"painting.leashedplayer.group_photo.author": "§9闲趣§4时§e坞§r",
"painting.leashedplayer.group_photo.title": "§d集体照 §7[§6纪念§7]§r"
}

View File

@ -37,5 +37,10 @@
"leashedplayer.command.leash.message.leash.data.show": "%1$s拴繩數據實體為%2$s",
"leashedplayer.command.leash.message.leash.length.failed": "失敗(内部錯誤,,可能你輸入的指令有誤)",
"leashedplayer.command.leash.message.leash.length.set": "%1$s的拴繩長度被設置為%2$s格",
"leashedplayer.command.leash.message.leash.length.show": "%1$s的拴繩長度為%2$s格"
"leashedplayer.command.leash.message.leash.length.show": "%1$s的拴繩長度為%2$s格",
"leashedplayer.command.motion.message.adder.successful": "§b添加成功.§a%s§7:§f[§e加速度§7:§a(§f%f§7,§f%f§7,§f%f§a)§f]§r",
"leashedplayer.command.motion.message.multiply.successful": "§b倍乘成功.§a%s§7:§f[§e加速度§7:§a(§f%f§7,§f%f§7,§f%f§a)§f]§r",
"leashedplayer.command.motion.message.setter.successful": "§b設置成功.§a%s§7:§f[§e加速度§7:§a(§f%f§7,§f%f§7,§f%f§a)§f]§r",
"painting.leashedplayer.group_photo.author": "§9閑趣§4時§e塢§r",
"painting.leashedplayer.group_photo.title": "§d集體照 §7[§6紀念§7]§r"
}

View File

@ -0,0 +1,5 @@
{
"asset_id": "leashedplayer:group_photo",
"height": 3,
"width": 4
}

View File

@ -2,7 +2,7 @@ package com.r3944realms.leashedplayer;
import com.mojang.brigadier.CommandDispatcher;
import com.r3944realms.leashedplayer.content.commands.LeashCommand;
import com.r3944realms.leashedplayer.content.items.ModCreativeTab;
import com.r3944realms.leashedplayer.content.commands.MotionCommand;
import com.r3944realms.leashedplayer.content.items.ModItemRegister;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.world.level.block.DispenserBlock;
@ -19,6 +19,7 @@ public class CommonEventHandler {
public static void onRegisterCommander(RegisterCommandsEvent event) {
CommandDispatcher<CommandSourceStack> dispatcher = event.getDispatcher();
LeashCommand.register(dispatcher);
MotionCommand.register(dispatcher);
}
}
@ -28,43 +29,9 @@ public class CommonEventHandler {
public static void onCommonSetup(FMLCommonSetupEvent event) {
DispenserBlock.registerProjectileBehavior(ModItemRegister.LEASH_ROPE_ARROW.get());
DispenserBlock.registerProjectileBehavior(ModItemRegister.SPECTRAL_LEASH_ROPE_ARROW.get());
// NeoForge.EVENT_BUS.addListener(Mod::onPlayerTick);
}
// public static void onPlayerTick(PlayerTickEvent.Pre event) {
// if (!event.getEntity().level().isClientSide && !event.getEntity().isUsingItem()) {
// Player player = event.getEntity();
//
// // 检测玩家视线中的实体
// Entity entity = getEntityLookedAt(player);
//
// // 如果实体是自定义箭实体
// if (entity instanceof LeashRopeArrow la) {
//
// // 处理玩家右键点击箭的交互逻辑
// if (player.isShiftKeyDown()) { // 可以结合 Shift
// if(la.pickup == AbstractArrow.Pickup.ALLOWED || ( player.isCreative() && la.pickup != AbstractArrow.Pickup.DISALLOWED )){
// player.take(la, 1);
// player.addItem(ModItemRegister.LEASH_ROPE_ARROW.get().getDefaultInstance());
// }
// }
// }
// }
// }
//
// // 射线检测方法获取玩家视线内的实体//TODO分离 Maybe XD
// private static Entity getEntityLookedAt(Player player) {
// double reach = 5.0D; // 设置射线检测距离 //TODO:与Player互动距离同步
// Vec3 eyePosition = player.getEyePosition(1.0F);
// Vec3 lookVector = player.getViewVector(1.0F).scale(reach);
// Vec3 targetPosition = eyePosition.add(lookVector);
//
// // 创建一个射线并检测结果
// AABB boundingBox = player.getBoundingBox().expandTowards(lookVector).inflate(1.0D, 1.0D, 1.0D);
// EntityHitResult hitResult = ProjectileUtil.getEntityHitResult(player, eyePosition, targetPosition, boundingBox, e -> e instanceof LeashRopeArrow, reach);
//
// return hitResult == null ? null : hitResult.getEntity();
// }
// }
}

View File

@ -5,6 +5,7 @@ import com.r3944realms.leashedplayer.content.criteriaTriggers.ModCriteriaTrigger
import com.r3944realms.leashedplayer.content.entities.ModEntityRegister;
import com.r3944realms.leashedplayer.content.items.ModCreativeTab;
import com.r3944realms.leashedplayer.content.items.ModItemRegister;
import com.r3944realms.leashedplayer.content.paintings.paintings.ModPaintingsRegister;
import com.r3944realms.leashedplayer.utils.Util;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.ModLoadingContext;
@ -19,6 +20,7 @@ public class LeashedPlayer {
private static Double M2;//繩箭拴繩掉落距離倍基數
public LeashedPlayer(IEventBus event) {
ModItemRegister.register(event);
ModPaintingsRegister.register(event);
ModEntityRegister.register(event);
ModCreativeTab.register(event);
ModCriteriaTriggers.register(event);

View File

@ -1,7 +1,22 @@
package com.r3944realms.leashedplayer.content.commands;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.r3944realms.leashedplayer.config.LeashPlayerCommonConfig;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
import org.jetbrains.annotations.Nullable;
import java.util.List;
public class Command {
public static final String PREFIX = LeashPlayerCommonConfig.LeashedPlayerModCommandPrefix.get();
static LiteralArgumentBuilder<CommandSourceStack> getLiterArgumentBuilderOfCSS(String name, boolean shouldAddToList, @Nullable List<LiteralArgumentBuilder<CommandSourceStack>> list) {
LiteralArgumentBuilder<CommandSourceStack> literal = Commands.literal(name);
if (shouldAddToList) {
assert list != null;
list.add(literal);
}
return literal;
}
}

View File

@ -28,6 +28,8 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import static com.r3944realms.leashedplayer.content.commands.Command.getLiterArgumentBuilderOfCSS;
public class LeashCommand {
public static final Integer MIN_VALUE = LeashPlayerCommonConfig.MinimumLeashLengthCanBeSet.get();
public static final Integer MAX_VALUE = LeashPlayerCommonConfig.MaximumLeashLengthCanBeSet.get();
@ -50,14 +52,7 @@ public class LeashCommand {
LEASH_DATA_SET_FAILED_FORBID_SAME_ENTITY = LEASH_DATA_SET + ".failed.forbid_same_entity",
LEASH_DATA_CLEAR_FAILED_NO_DATA = LEASH_DATA_CLEAR + ".leash.clear.failed.no_data"
;
private static LiteralArgumentBuilder<CommandSourceStack> getLiterArgumentBuilderOfCSS(String name, boolean shouldAddToList, @Nullable List<LiteralArgumentBuilder<CommandSourceStack>> list) {
LiteralArgumentBuilder<CommandSourceStack> literal = Commands.literal(name);
if (shouldAddToList) {
assert list != null;
list.add(literal);
}
return literal;
}
public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {
boolean shouldUsePrefix = LeashPlayerCommonConfig.EnableLeashPlayerCommandPrefix.get();
@Nullable List<LiteralArgumentBuilder<CommandSourceStack>> nodeList = shouldUsePrefix ? null : new ArrayList<>();

View File

@ -0,0 +1,126 @@
package com.r3944realms.leashedplayer.content.commands;
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;
import net.minecraft.commands.arguments.EntityArgument;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.phys.Vec3;
import net.neoforged.neoforge.network.PacketDistributor;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
import static com.r3944realms.leashedplayer.content.commands.Command.getLiterArgumentBuilderOfCSS;
public class MotionCommand {
private final static String LEASHED_PLAYER_MOTION_MESSAGE_ = "leashedplayer.command.motion.message.";
public final static String MOTION_SETTER_SUCCESSFUL = LEASHED_PLAYER_MOTION_MESSAGE_ + "setter.successful",
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<>();
LiteralArgumentBuilder<CommandSourceStack> literalArgumentBuilder = Commands.literal(com.r3944realms.leashedplayer.content.commands.Command.PREFIX);
LiteralArgumentBuilder<CommandSourceStack> $$motionRoot = getLiterArgumentBuilderOfCSS("motion", !shouldUsePrefix, nodeList);
com.mojang.brigadier.Command<CommandSourceStack> motionVecAdder = context -> {
CommandSourceStack source = context.getSource();
for(Entity entity : EntityArgument.getEntities(context, "targets")){
Vec3 motionVec = new Vec3(
DoubleArgumentType.getDouble(context, "vecX"),
DoubleArgumentType.getDouble(context, "vecY"),
DoubleArgumentType.getDouble(context, "vecZ")
);
if(entity instanceof ServerPlayer player) {
PacketDistributor.sendToPlayer(player, new UpdatePlayerMovement(UpdatePlayerMovement.Operation.ADD, motionVec.x, motionVec.y, motionVec.z));
} else {
entity.addDeltaMovement(motionVec);
}
double vecX = entity.getDeltaMovement().x, vecY = entity.getDeltaMovement().y, vecZ = entity.getDeltaMovement().z;
source.sendSuccess(() -> Component.translatable(MOTION_ADDER_SUCCESSFUL, entity.getName().copy().withStyle(), vecX, vecY, vecZ), true);
}
return 0;
};
Command<CommandSourceStack> motionVecSetter = context -> {
CommandSourceStack source = context.getSource();
for(Entity entity : EntityArgument.getEntities(context, "targets")){
Vec3 motionVec = new Vec3(
DoubleArgumentType.getDouble(context, "vecX"),
DoubleArgumentType.getDouble(context, "vecY"),
DoubleArgumentType.getDouble(context, "vecZ")
);
if(entity instanceof ServerPlayer player) {
PacketDistributor.sendToPlayer(player, new UpdatePlayerMovement(UpdatePlayerMovement.Operation.SET, motionVec.x, motionVec.y, motionVec.z));
} else {
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);
}
return 0;
};
Command<CommandSourceStack> motionVecMultiply = context -> {
CommandSourceStack source = context.getSource();
for(Entity entity : EntityArgument.getEntities(context, "targets")){
Vec3 motionFactorVec = new Vec3(
DoubleArgumentType.getDouble(context, "vecXFactor"),
DoubleArgumentType.getDouble(context, "vecYFactor"),
DoubleArgumentType.getDouble(context, "vecZFactor")
);
if(entity instanceof ServerPlayer player) {
PacketDistributor.sendToPlayer(player, new UpdatePlayerMovement(UpdatePlayerMovement.Operation.MULTIPLY, motionFactorVec.x, motionFactorVec.y, motionFactorVec.z));
} else {
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);
}
return 0;
};
LiteralArgumentBuilder<CommandSourceStack> Motion = $$motionRoot.requires(cs -> cs.hasPermission(2))
.then(Commands.argument("targets", EntityArgument.entities())
.then(Commands.literal("add")
.then(Commands.argument("vecX", DoubleArgumentType.doubleArg())
.then(Commands.argument("vecY", DoubleArgumentType.doubleArg())
.then(Commands.argument("vecZ", DoubleArgumentType.doubleArg())
.executes(motionVecAdder)
)
)
)
)
.then(Commands.literal("set")
.then(Commands.argument("vecX", DoubleArgumentType.doubleArg())
.then(Commands.argument("vecY", DoubleArgumentType.doubleArg())
.then(Commands.argument("vecZ", DoubleArgumentType.doubleArg())
.executes(motionVecSetter)
)
)
)
)
.then(Commands.literal("multiply")
.then(Commands.argument("vecXFactor", DoubleArgumentType.doubleArg())
.then(Commands.argument("vecYFactor", DoubleArgumentType.doubleArg())
.then(Commands.argument("vecZFactor", DoubleArgumentType.doubleArg())
.executes(motionVecMultiply)
)
)
)
)
);
if(shouldUsePrefix){
literalArgumentBuilder.then(Motion);
dispatcher.register(literalArgumentBuilder);
} else {
nodeList.forEach(dispatcher::register);
}
}
}

View File

@ -0,0 +1,25 @@
package com.r3944realms.leashedplayer.content.paintings.paintings;
import com.r3944realms.leashedplayer.LeashedPlayer;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.decoration.PaintingVariant;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.neoforge.registries.DeferredRegister;
import org.jetbrains.annotations.NotNull;
import java.util.function.Supplier;
public class ModPaintingsRegister {
public static final DeferredRegister<PaintingVariant> PAINTING_VARIANT =
DeferredRegister.create(Registries.PAINTING_VARIANT, LeashedPlayer.MOD_ID);
public static final Supplier<PaintingVariant> GROUP_PHOTO = PAINTING_VARIANT.register("group_photo", () -> new PaintingVariant(1920, 1080, getAssetId("group_photo")));
private static @NotNull ResourceLocation getAssetId( String paint_name) {
return ResourceLocation.fromNamespaceAndPath(LeashedPlayer.MOD_ID, "textures/painting/"+paint_name+".png");
}
public static void register(IEventBus eventBus) {
PAINTING_VARIANT.register(eventBus);
}
}

View File

@ -1,6 +1,7 @@
package com.r3944realms.leashedplayer.datagen.LanguageAndOtherData;
import com.r3944realms.leashedplayer.content.commands.LeashCommand;
import com.r3944realms.leashedplayer.content.commands.MotionCommand;
import com.r3944realms.leashedplayer.content.entities.ModEntityRegister;
import com.r3944realms.leashedplayer.content.gamerules.Server.CreateLeashFenceKnotEntityIfAbsent;
import com.r3944realms.leashedplayer.content.gamerules.Server.KeepLeashNotDropTime;
@ -8,6 +9,7 @@ import com.r3944realms.leashedplayer.content.gamerules.Server.TeleportWithLeashe
import com.r3944realms.leashedplayer.content.items.type.LeashRopeArrowItem;
import com.r3944realms.leashedplayer.content.items.ModCreativeTab;
import com.r3944realms.leashedplayer.content.items.ModItemRegister;
import com.r3944realms.leashedplayer.datagen.provider.attributes.ModPaintingVariants;
import com.r3944realms.leashedplayer.utils.Enum.LanguageEnum;
import com.r3944realms.leashedplayer.utils.Enum.ModPartEnum;
import net.minecraft.world.item.Item;
@ -26,6 +28,9 @@ public enum ModLangKeyValue {
TEST_FABRIC_ITEM(ModItemRegister.FABRIC, ModPartEnum.ITEM, "Fabric", "Fabric", "Fabric", true),
//ITEM_DESC
DESC_ITEM_LEASH_ROPE_ARROW(LeashRopeArrowItem.descKey, ModPartEnum.DESCRIPTION, "Arrows with ropes attached?","带有拴绳的箭矢?", "帶有拴繩的箭矢?", false),
//PAINTING
GROUP_PHOTO_TITLE(ModPaintingVariants.getPaintingVariantTitleKey(ModPaintingVariants.GROUP_PHOTO),ModPartEnum.TITLE, "§dGroup Photo §7[§6memorable§7]§r", "§d集体照 §7[§6纪念§7]§r", "§d集體照 §7[§6紀念§7]§r", false),
GROUP_PHOTO_AUTHOR(ModPaintingVariants.getPaintingVariantAuthorKey(ModPaintingVariants.GROUP_PHOTO),ModPartEnum.AUTHOR, "§9Leisure §4Time §eDock§r","§9闲趣§4时§e坞§r","§9閑趣§4時§e塢§r",false),
//ENTITY
LEASH_ROPE_ARROW(ModEntityRegister.getEntityNameKey("leash_rope_arrow"), ModPartEnum.ENTITY, "Leash Rope Arrow", "拴绳箭", "拴繩箭", false),
SPECTRAL_LEASH_ROPE_ARROW(ModEntityRegister.getEntityNameKey("spectral_leash_rope_arrow"), ModPartEnum.ENTITY, "Spectral Leash Rope Arrow", "拴绳光灵箭", "拴繩光靈箭", false),
@ -44,6 +49,9 @@ public enum ModLangKeyValue {
MESSAGE_LEASH_CLEAR(LeashCommand.LEASH_DATA_CLEAR, ModPartEnum.COMMAND, "%1$s's LeashData(LeashHolderEntity: %2$s) now is clear", "%1$s的拴绳数据拴绳持有者实体%2$s现在已清除", "%1$s的拴繩數據拴繩持有者實體%2$s現在已清除", false),
MESSAGE_LEASH_SET_FAILED_FORBID_SAME_ENTITY(LeashCommand.LEASH_DATA_SET_FAILED_FORBID_SAME_ENTITY, ModPartEnum.COMMAND, "Prohibit setting the same entity","禁止设置同一实体", "禁止設置同一實體", false),
MESSAGE_LEASH_CLEAR_FAILED(LeashCommand.LEASH_DATA_CLEAR_FAILED_NO_DATA, ModPartEnum.COMMAND, "%1$s has no LeashData can be clear", "%1$s沒有拴绳数据可清除", "%1$s沒有拴繩數據實體可被清除", false),
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),
//GAME_RULE_NAME
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),

View File

@ -25,6 +25,7 @@ public class ModDataGeneratorHandler {
addLanguage(event, LanguageEnum.TraditionalChinese);
addLanguage(event, LanguageEnum.LiteraryChinese);
ModDataPackBuiltInEntriesProvider(event, holderFolder);
ModPaintVariantTagsProvider(event, holderFolder, existingFileHelper);
ItemModelGenerator(event, existingFileHelper);
RecipeGenerator(event, holderFolder);
ModTagsProvider(event, event.getLookupProvider(), existingFileHelper);
@ -66,10 +67,19 @@ public class ModDataGeneratorHandler {
event.includeServer(),
(DataProvider.Factory<ModDataPackBuiltInEntriesProvider>) pOutput -> new ModDataPackBuiltInEntriesProvider(pOutput, future)
);
}private static void ModAdvancementProvider(GatherDataEvent event, CompletableFuture<HolderLookup.Provider> pLookUpProvider, ExistingFileHelper helper) {
}
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));
}
private static void ModPaintVariantTagsProvider(GatherDataEvent event, CompletableFuture<HolderLookup.Provider> completableFuture, ExistingFileHelper helper) {
event.getGenerator().addProvider(
event.includeServer(),
(DataProvider.Factory<ModPaintingVariantTagsProvider>) pOutput -> {
return new ModPaintingVariantTagsProvider(pOutput, completableFuture, LeashedPlayer.MOD_ID, helper);
}
);
}
}

View File

@ -1,8 +1,10 @@
package com.r3944realms.leashedplayer.datagen.provider;
import com.r3944realms.leashedplayer.LeashedPlayer;
import com.r3944realms.leashedplayer.datagen.provider.attributes.ModPaintingVariants;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.RegistrySetBuilder;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.PackOutput;
import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider;
@ -11,7 +13,7 @@ import java.util.concurrent.CompletableFuture;
public class ModDataPackBuiltInEntriesProvider extends DatapackBuiltinEntriesProvider {
public static final RegistrySetBuilder BUILDER = new RegistrySetBuilder()
;
.add(Registries.PAINTING_VARIANT, ModPaintingVariants::bootstrap);
public ModDataPackBuiltInEntriesProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> registries) {
super(output, registries, BUILDER, Set.of(LeashedPlayer.MOD_ID));
CompletableFuture<HolderLookup.Provider> registryProvider = getRegistryProvider();

View File

@ -0,0 +1,24 @@
package com.r3944realms.leashedplayer.datagen.provider;
import com.r3944realms.leashedplayer.datagen.provider.attributes.ModPaintingVariants;
import net.minecraft.core.HolderLookup;
import net.minecraft.data.PackOutput;
import net.minecraft.data.tags.PaintingVariantTagsProvider;
import net.minecraft.tags.PaintingVariantTags;
import net.neoforged.neoforge.common.data.ExistingFileHelper;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.concurrent.CompletableFuture;
public class ModPaintingVariantTagsProvider extends PaintingVariantTagsProvider {
public ModPaintingVariantTagsProvider(PackOutput pOutput, CompletableFuture<HolderLookup.Provider> pProvider, String modId, @Nullable ExistingFileHelper existingFileHelper) {
super(pOutput, pProvider, modId, existingFileHelper);
}
@Override
protected void addTags(HolderLookup.@NotNull Provider pProvider) {
this.tag(PaintingVariantTags.PLACEABLE)
.add(ModPaintingVariants.GROUP_PHOTO);
}
}

View File

@ -0,0 +1,41 @@
package com.r3944realms.leashedplayer.datagen.provider.attributes;
import com.r3944realms.leashedplayer.LeashedPlayer;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.worldgen.BootstrapContext;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.decoration.PaintingVariant;
public class ModPaintingVariants {
public static final ResourceKey<PaintingVariant> GROUP_PHOTO = create("group_photo");
public static void bootstrap(BootstrapContext<PaintingVariant> pContext) {
PaintingVariantBootstrap(pContext);
}
public static void PaintingVariantBootstrap(BootstrapContext<PaintingVariant> pContext) {
ModPaintingVariants.register(pContext, ModPaintingVariants.GROUP_PHOTO, 4, 3);
}
private static void register(BootstrapContext<PaintingVariant> pContext, ResourceKey<PaintingVariant> pKey, int pWidth, int pHeight) {
pContext.register(pKey, new PaintingVariant(pWidth, pHeight, pKey.location()));
}
private static ResourceKey<PaintingVariant> create(String pName) {
return ResourceKey.create(Registries.PAINTING_VARIANT, ResourceLocation.fromNamespaceAndPath(LeashedPlayer.MOD_ID, pName));
}
public static String getPaintingVariantTitleKey(ResourceKey<PaintingVariant> pKey) {
return "painting." + pKey.location().getNamespace() + "." + pKey.location().getPath() + ".title";
}
public static String getPaintingVariantAuthorKey(ResourceKey<PaintingVariant> pKey) {
return "painting." + pKey.location().getNamespace() + "." + pKey.location().getPath() + ".author";
}
public static String getPaintingVariantTitleKey(String pName) {
return "painting." + LeashedPlayer.MOD_ID + "." + pName + ".title";
}
public static String getPaintingVariantAuthorKey(String pName) {
return "painting." + LeashedPlayer.MOD_ID + "." + pName + ".author";
}
}

View File

@ -0,0 +1,53 @@
package com.r3944realms.leashedplayer.mixin;
import org.objectweb.asm.tree.ClassNode;
import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
import java.util.List;
import java.util.Set;
public class MixinPlugin implements IMixinConfigPlugin {
@Override
public void onLoad(String mixinPackage) {
}
@Override
public String getRefMapperConfig() {
return null;
}
@Override
public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
// 检查当前是否在数据生成阶段
// 根据需要添加逻辑来控制特定Mixin类的应用
boolean isRegister = mixinClassName.split("com\\.r3944realms\\.leashedplayer\\.mixin\\.")[1].split("\\.")[0].equals("registry");
if (isRegister) {
return isDataGeneration();
}
return true; // 其他Mixin类默认应用
}
private boolean isDataGeneration() {
// 使用你的逻辑来检查是否在数据生成阶段
String environment = System.getProperty("gradle.task");
return "runData".equals(environment);
}
@Override
public void acceptTargets(Set<String> myTargets, Set<String> otherTargets) {
}
@Override
public List<String> getMixins() {
return null;
}
@Override
public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {
}
@Override
public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {
}
}

View File

@ -0,0 +1,19 @@
package com.r3944realms.leashedplayer.mixin.registry;
import com.r3944realms.leashedplayer.datagen.provider.attributes.ModPaintingVariants;
import net.minecraft.data.worldgen.BootstrapContext;
import net.minecraft.world.entity.decoration.PaintingVariant;
import net.minecraft.world.entity.decoration.PaintingVariants;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(PaintingVariants.class)
public class MixinPaintingVariants {
@Inject(method = {"bootstrap"}, at = @At("TAIL"))
private static void bootstrap(BootstrapContext<PaintingVariant> pContext , CallbackInfo ci) {
ModPaintingVariants.PaintingVariantBootstrap(pContext);
}
}

View File

@ -0,0 +1,23 @@
package com.r3944realms.leashedplayer.network;
import com.r3944realms.leashedplayer.LeashedPlayer;
import com.r3944realms.leashedplayer.network.client.UpdatePlayerMovement;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent;
import net.neoforged.neoforge.network.registration.PayloadRegistrar;
@EventBusSubscriber(modid = LeashedPlayer.MOD_ID, bus = EventBusSubscriber.Bus.MOD)
public class LeashedPlayerNetwork {
@SubscribeEvent
public static void registerPackets(RegisterPayloadHandlersEvent event) {
PayloadRegistrar registrar = event.registrar(LeashedPlayer.MOD_ID);
registrar.playToClient(
UpdatePlayerMovement.TYPE,
UpdatePlayerMovement.STREAM_CODEC,
UpdatePlayerMovement::handle
);
}
}

View File

@ -0,0 +1,55 @@
package com.r3944realms.leashedplayer.network.client;
import com.r3944realms.leashedplayer.LeashedPlayer;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.phys.Vec3;
import net.neoforged.neoforge.network.codec.NeoForgeStreamCodecs;
import net.neoforged.neoforge.network.handling.IPayloadContext;
import org.jetbrains.annotations.NotNull;
/**
* @author qyl27
* @param operation
* @param x
* @param y
* @param z
*/
public record UpdatePlayerMovement(Operation operation, double x, double y, double z) implements CustomPacketPayload {
public static final CustomPacketPayload.Type<UpdatePlayerMovement> TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(LeashedPlayer.MOD_ID,"update_player_movement"));
@Override
public @NotNull Type<? extends CustomPacketPayload> type() {
return TYPE;
}
public static final StreamCodec<FriendlyByteBuf, UpdatePlayerMovement> STREAM_CODEC =
StreamCodec.composite(
NeoForgeStreamCodecs.enumCodec(Operation.class), UpdatePlayerMovement::operation,
ByteBufCodecs.DOUBLE, UpdatePlayerMovement::x,
ByteBufCodecs.DOUBLE, UpdatePlayerMovement::y,
ByteBufCodecs.DOUBLE, UpdatePlayerMovement::z,
UpdatePlayerMovement::new
);
public void handle(IPayloadContext context) {
context.enqueueWork(() -> {
Player player = context.player();
switch (operation) {
case ADD -> player.addDeltaMovement(new Vec3(x, y, z));
case SET -> player.setDeltaMovement(new Vec3(x, y, z));
case MULTIPLY -> player.addDeltaMovement(player.getDeltaMovement().multiply(x, y, z));
}
}
);
}
public enum Operation {
SET,
ADD,
MULTIPLY
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 852 KiB

View File

@ -5,6 +5,7 @@
"both.MixinLivingEntity",
"both.MixinPlayer",
"item.MixinLeadItem",
"registry.MixinPaintingVariants",
"server.MixinServerGamePacketListenerImpl"
],
"client": [
@ -15,5 +16,6 @@
"refmap": "whimsicality.refmap.json",
"required": true,
"minVersion": "0.8",
"compatibilityLevel": "JAVA_17"
"compatibilityLevel": "JAVA_17",
"plugin": "com.r3944realms.leashedplayer.mixin.MixinPlugin"
}