Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions gradle/scripts/dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ repositories {
name 'Modrinth'
url 'https://api.modrinth.com/maven'
}
maven {
name 'BlameJared'
url 'https://maven.blamejared.com'
}
mavenLocal() // Must be last for caching to work
}

Expand Down Expand Up @@ -80,4 +84,7 @@ dependencies {

// 游泳
compileOnly rfg.deobf('curse.maven:aqua-acrobatics-321792:5225456')

// Carry On
compileOnly rfg.deobf('tschipp.carryon:carryon-1.12.2:1.12.7.23')
}
Original file line number Diff line number Diff line change
Expand Up @@ -69,71 +69,69 @@ public static void registerAll(ModelData data) {
ClientModelManager.registerTexture(modelId, data.getTexture());
}

public static void registerGeo(ResourceLocation id, Map<String, byte[]> mapData) {
byte[] infoData = mapData.get("info");
for (String name : mapData.keySet()) {
if ("info".equals(name)) continue;
byte[] data = mapData.get(name);
registerGeo(ModelIdUtil.getSubModelId(id, name), data, "main".equals(name) ? infoData : null);
public static void registerGeo(ResourceLocation modelId, Map<String, byte[]> modelData) {
for (Map.Entry<String, byte[]> entry : modelData.entrySet()) {
String partName = entry.getKey();
if ("info".equals(partName)) continue;
registerGeo(modelId, partName, entry.getValue());
}
byte[] infoData = modelData.get("info");
if (infoData != null && ObjectStreamUtil.toObject(infoData) instanceof ExtraInfo extraInfo) {
addExtraInfo(modelId, extraInfo);
}
}

private static void registerGeo(ResourceLocation id, byte[] data, @Nullable byte[] infoData) {
private static void registerGeo(ResourceLocation modelId, String partName, byte[] partData) {
Map<ResourceLocation, GeoModel> geoModels = GeckoLibCache.getInstance().getGeoModels();
try {
Object obj = ObjectStreamUtil.toObject(data);
Object obj = ObjectStreamUtil.toObject(partData);
if (obj instanceof RawGeoModel rawModel) {
if (rawModel.getFormatVersion() == FormatVersion.VERSION_1_12_0) {
RawGeometryTree rawGeometryTree = RawGeometryTree.parseHierarchy(rawModel);
GeoModel geoModel = GeoBuilder.getGeoBuilder(id.getNamespace()).constructGeoModel(rawGeometryTree);
SCALE_INFO.put(id, Pair.of(rawGeometryTree.properties.getHeightScale(), rawGeometryTree.properties.getWidthScale()));
ExtraInfo extraInfo = rawGeometryTree.properties.getExtraInfo();
if (infoData != null && ObjectStreamUtil.toObject(infoData) instanceof ExtraInfo info) {
extraInfo = info;
ResourceLocation partId = ModelIdUtil.getSubModelId(modelId, partName);
GeoModel geoModel = GeoBuilder.getGeoBuilder(partId.getNamespace()).constructGeoModel(rawGeometryTree);
if ("main".equals(partName)) {
SCALE_INFO.put(partId, Pair.of(rawGeometryTree.properties.getHeightScale(), rawGeometryTree.properties.getWidthScale()));
addExtraInfo(modelId, rawGeometryTree.properties.getExtraInfo());
}
EXTRA_INFO.put(id, handleExtraInfo(id, extraInfo));
if (extraInfo != null && extraInfo.getExtraAnimationNames() != null && extraInfo.getExtraAnimationNames().length > 0) {
EXTRA_ANIMATION_NAME.put(id, extraInfo.getExtraAnimationNames());
}
geoModels.put(id, geoModel);
geoModels.put(partId, geoModel);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}

public static void registerTexture(ResourceLocation id, Map<String, byte[]> mapData) {
public static void registerTexture(ResourceLocation modelId, Map<String, byte[]> mapData) {
List<ResourceLocation> textures = Lists.newArrayList();
for (String name : mapData.keySet()) {
if (!name.equals(IArrowExtraInfo.TEXTURE_NAME)) {
ResourceLocation textureId = ModelIdUtil.getSubModelId(id, name);
ResourceLocation textureId = ModelIdUtil.getSubModelId(modelId, name);
textures.add(textureId);
}
}
MODELS.put(id, textures);
for (String name : mapData.keySet()) {
byte[] data = mapData.get(name);
ResourceLocation textureId = ModelIdUtil.getSubModelId(id, name);
registerTexture(textureId, data);
MODELS.put(modelId, textures);
for (Map.Entry<String, byte[]> entry : mapData.entrySet()) {
ResourceLocation textureId = ModelIdUtil.getSubModelId(modelId, entry.getKey());
registerTexture(textureId, entry.getValue());
}
}

private static void registerTexture(ResourceLocation id, byte[] data) {
private static void registerTexture(ResourceLocation textureId, byte[] data) {
// 确保主线程上传
final Minecraft mc = Minecraft.getMinecraft();
mc.addScheduledTask(() -> {
mc.getTextureManager().loadTexture(id, new OuterFileTexture(data));
mc.getTextureManager().loadTexture(textureId, new OuterFileTexture(data));
});
}

private static void registerAnimations(ResourceLocation id, Map<String, byte[]> mapData) {
private static void registerAnimations(ResourceLocation mainId, Map<String, byte[]> mapData) {
Map<ResourceLocation, AnimationFile> animations = GeckoLibCache.getInstance().getAnimations();

if (mapData.containsKey("arrow")) {
byte[] arrowBytes = mapData.get("arrow");
AnimationFile arrowsAnimationFile = getAnimationFile(new String(arrowBytes, StandardCharsets.UTF_8));
animations.put(ModelIdUtil.getArrowId(ModelIdUtil.getModelIdFromMainId(id)), arrowsAnimationFile);
animations.put(ModelIdUtil.getArrowId(ModelIdUtil.getModelIdFromMainId(mainId)), arrowsAnimationFile);
mapData.remove("arrow");
}

Expand All @@ -147,8 +145,8 @@ private static void registerAnimations(ResourceLocation id, Map<String, byte[]>
main.putAnimation(name, action);
}
});
main.animations().forEach((name, animation) -> ConditionManager.addTest(id, name));
animations.put(id, main);
main.animations().forEach((name, animation) -> ConditionManager.addTest(mainId, name));
animations.put(mainId, main);
}

private static AnimationFile getAnimationFile(String file) {
Expand Down Expand Up @@ -177,7 +175,7 @@ private static AnimationFile mergeAnimationFile(AnimationFile main, AnimationFil

public static void loadDefaultModel() {
try {
ModelData data = FolderFormat.getModelData(ServerModelManager.CUSTOM, "default", false);
ModelData data = FolderFormat.getModelData(ServerModelManager.BUILTIN, "default", false);
data.getAnimation().forEach((name, bytes) -> {
AnimationFile animationFile = getAnimationFile(new String(bytes, StandardCharsets.UTF_8));
if ("arrow".equals(name)) {
Expand Down Expand Up @@ -229,8 +227,20 @@ private static byte[] getBytes(Path root, String fileName) throws IOException {
return FileUtils.readFileToByteArray(root.resolve(fileName).toFile());
}

private static void addExtraInfo(ResourceLocation modelId, @Nullable ExtraInfo extraInfo) {
if (extraInfo == null) return;
ResourceLocation infoId = ModelIdUtil.getInfoId(modelId);
EXTRA_INFO.put(infoId, handleExtraInfo(extraInfo));
if (extraInfo.getFree()) {
AUTH_MODELS.remove(modelId.getPath());
}
if (extraInfo.getExtraAnimationNames() != null && extraInfo.getExtraAnimationNames().length > 0) {
EXTRA_ANIMATION_NAME.put(infoId, extraInfo.getExtraAnimationNames());
}
}

@Nullable
private static List<String> handleExtraInfo(ResourceLocation id, @Nullable ExtraInfo extraInfo) {
private static List<String> handleExtraInfo(@Nullable ExtraInfo extraInfo) {
if (extraInfo == null || StringUtils.isBlank(extraInfo.getName())) {
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public void preInit(FMLPreInitializationEvent event) {
super.preInit(event);
MinecraftForge.EVENT_BUS.register(new ConfigSyncEvent());

CarryOnCompat.init();
CrossbowCompat.init();
ElytraCompat.init();
SpyglassCompat.init();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.elfmcys.yesstevemodel.client.animation;

import com.elfmcys.yesstevemodel.client.animation.condition.*;
import com.elfmcys.yesstevemodel.client.compat.CrossbowCompat;
import com.elfmcys.yesstevemodel.client.compat.CarryOnCompat;
import com.elfmcys.yesstevemodel.client.entity.CustomPlayerEntity;
import com.elfmcys.yesstevemodel.event.CapabilityEvent;
import com.elfmcys.yesstevemodel.geckolib3.core.IAnimatable;
Expand Down Expand Up @@ -79,13 +79,15 @@ public void register(AnimationState state) {
}
}

@Nonnull
public PlayState predicateParallel(AnimationEvent<CustomPlayerEntity> event, String animationName) {
if (Minecraft.getMinecraft().isGamePaused()) {
return PlayState.STOP;
}
return playLoopAnimation(event, animationName);
}

@Nonnull
public PlayState predicateCap(AnimationEvent<CustomPlayerEntity> event) {
CustomPlayerEntity animatable = event.getAnimatable();
EntityPlayer player = animatable.getPlayer();
Expand Down Expand Up @@ -129,12 +131,13 @@ public PlayState predicateMain(AnimationEvent<CustomPlayerEntity> event) {
return PlayState.STOP;
}

@Nonnull
public PlayState predicateOffhandHold(AnimationEvent<CustomPlayerEntity> event) {
EntityPlayer player = event.getAnimatable().getPlayer();
if (player == null) {
return PlayState.STOP;
}
if (!player.getHeldItemOffhand().isEmpty() && this.checkSwingAndUse(player, EnumHand.OFF_HAND)) {
if (this.checkSwingAndUse(player, EnumHand.OFF_HAND)) {
ResourceLocation id = event.getAnimatable().getAnimation();
ConditionalHold conditionalHold = ConditionManager.getHoldOffhand(id);
if (conditionalHold != null) {
Expand All @@ -147,29 +150,19 @@ public PlayState predicateOffhandHold(AnimationEvent<CustomPlayerEntity> event)
return PlayState.STOP;
}

@Nonnull
public PlayState predicateMainhandHold(AnimationEvent<CustomPlayerEntity> event) {
EntityPlayer player = event.getAnimatable().getPlayer();
if (player == null) {
return PlayState.STOP;
}
if (!player.isSwingInProgress && !player.isHandActive()) {
ItemStack mainHandItem = player.getHeldItem(EnumHand.MAIN_HAND);
if (CrossbowCompat.isCharged(mainHandItem)) {
return playAnimation(event, "hold_mainhand:charged_crossbow", ILoopType.EDefaultLoopTypes.LOOP);
}
// if (Loader.isModLoaded(TAC_ID) && TacGunRenderer.isGun(mainHandItem)) {
// return TacGunRenderer.playGunHoldAnimation(event, mainHandItem);
// }
ItemStack offhandItem = player.getHeldItem(EnumHand.OFF_HAND);
if (CrossbowCompat.isCharged(offhandItem)) {
return playAnimation(event, "hold_offhand:charged_crossbow", ILoopType.EDefaultLoopTypes.LOOP);
}
if (player.fishEntity != null) {
return playAnimation(event, "hold_mainhand:fishing", ILoopType.EDefaultLoopTypes.LOOP);
if (CarryOnCompat.isInstalled()) {
String carryName = CarryOnCompat.getCarryOnString(player);
if (StringUtils.isNoneBlank(carryName)) {
return playAnimation(event, "carryon:" + carryName, ILoopType.EDefaultLoopTypes.LOOP);
}
}

if (!player.getHeldItemMainhand().isEmpty() && this.checkSwingAndUse(player, EnumHand.MAIN_HAND)) {
if (this.checkSwingAndUse(player, EnumHand.MAIN_HAND)) {
ResourceLocation id = event.getAnimatable().getAnimation();
ConditionalHold conditionalHold = ConditionManager.getHoldMainhand(id);
if (conditionalHold != null) {
Expand All @@ -182,29 +175,41 @@ public PlayState predicateMainhandHold(AnimationEvent<CustomPlayerEntity> event)
return PlayState.STOP;
}

@Nonnull
public PlayState predicateSwing(AnimationEvent<CustomPlayerEntity> event) {
EntityPlayer player = event.getAnimatable().getPlayer();
if (player == null) {
return PlayState.STOP;
}
if (player.isSwingInProgress && !player.isPlayerSleeping()) {
if (player.swingProgressInt == 0) {
event.getController().shouldResetTick = true;
event.getController().adjustTick(0);
event.getController().markNeedsReload();
}
ResourceLocation id = event.getAnimatable().getAnimation();
ConditionalSwing conditionalSwing = ConditionManager.getSwing(id);
if (conditionalSwing != null) {
String name = conditionalSwing.doTest(player, player.swingingHand);
if (StringUtils.isNoneBlank(name)) {
return playAnimation(event, name, ILoopType.EDefaultLoopTypes.LOOP);
if (player.swingingHand == EnumHand.MAIN_HAND) {
ResourceLocation id = event.getAnimatable().getAnimation();
ConditionalSwing conditionalSwing = ConditionManager.getSwing(id);
if (conditionalSwing != null) {
String name = conditionalSwing.doTest(player, EnumHand.MAIN_HAND);
if (StringUtils.isNoneBlank(name)) {
return playAnimation(event, name, ILoopType.EDefaultLoopTypes.PLAY_ONCE);
}
}
} else {
ResourceLocation id = event.getAnimatable().getAnimation();
ConditionalSwing conditionalSwing = ConditionManager.getSwingOffhand(id);
if (conditionalSwing != null) {
String name = conditionalSwing.doTest(player, EnumHand.OFF_HAND);
if (StringUtils.isNoneBlank(name)) {
return playAnimation(event, name, ILoopType.EDefaultLoopTypes.PLAY_ONCE);
}
}
}
return playAnimation(event, "swing_hand", ILoopType.EDefaultLoopTypes.LOOP);
return playAnimation(event, "swing_hand", ILoopType.EDefaultLoopTypes.PLAY_ONCE);
}
return PlayState.STOP;
return event.getController().getAnimationState() == com.elfmcys.yesstevemodel.geckolib3.core.AnimationState.STOPPED ? PlayState.STOP : PlayState.CONTINUE;
}

@Nonnull
public PlayState predicateUse(AnimationEvent<CustomPlayerEntity> event) {
EntityPlayer player = event.getAnimatable().getPlayer();
if (player == null) {
Expand Down Expand Up @@ -243,6 +248,7 @@ public PlayState predicateUse(AnimationEvent<CustomPlayerEntity> event) {
return PlayState.STOP;
}

@Nonnull
public PlayState predicateArmor(AnimationEvent<CustomPlayerEntity> event, EntityEquipmentSlot slot) {
EntityPlayer player = event.getAnimatable().getPlayer();
if (player == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EnumPlayerModelParts;
import net.minecraft.entity.projectile.EntityArrow;
import net.minecraft.entity.projectile.EntitySpectralArrow;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.EnumAction;
import net.minecraft.item.ItemStack;
Expand Down Expand Up @@ -251,13 +252,16 @@ public static void setParserValue(AnimationEvent<CustomPlayerEntity> animationEv
// }
}

// TODO:补全
public static void setArrowParserValue(EntityArrow arrow, MolangParser parser) {
parser.setValue("query.body_x_rotation", () -> arrow.rotationPitch);
parser.setValue("query.body_y_rotation", () -> MathHelper.wrapDegrees(arrow.rotationYaw));
parser.setValue("query.is_on_ground", () -> MolangUtils.booleanToFloat(arrow.inGround));
parser.setValue("query.ground_speed", () -> getGroundSpeed(arrow));
parser.setValue("query.vertical_speed", () -> getVerticalSpeed(arrow));
parser.setValue("ysm.in_ground", () -> MolangUtils.booleanToFloat(arrow.inGround));
parser.setValue("ysm.on_ground_time", () -> arrow.timeInGround);
parser.setValue("ysm.is_spectral_arrow", () -> MolangUtils.booleanToFloat(arrow instanceof EntitySpectralArrow));
}

private static boolean hasCape(EntityPlayer player) {
Expand Down
Loading