commit
40ae2c14e1
|
|
@ -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>` - 给实体添加/设置/倍乘 加速度
|
||||
|
||||
## 游戏规则
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
}
|
||||
|
|
@ -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"
|
||||
}
|
||||
|
|
@ -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"
|
||||
}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"asset_id": "leashedplayer:group_photo",
|
||||
"height": 3,
|
||||
"width": 4
|
||||
}
|
||||
|
|
@ -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();
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<>();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
|
@ -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) {
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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 |
|
|
@ -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"
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user