Рендеринг рук игрока

تم الإنشاء في: ٩ أكتوبر ٢٠٢٤

تمت الإجابة باستخدام O1 Preview بواسطة Chat01

سؤال

Привет, я делаю модификацию на майнкрафт и мне нужно сделать так, чтобы руки игрока рендерелись направленны вверх
Вот код, напиши полный код с изменениями:
package net.mcreator.fairytaleelementsbeta.procedures;

import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.eventbus.api.Event;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;

import javax.annotation.Nullable;

@Mod.EventBusSubscriber
public class ArmAiProcedure {
@SubscribeEvent
public static void onRightClickItem(PlayerInteractEvent.RightClickItem event) {
if (event.getHand() != event.getEntity().getUsedItemHand())
return;
execute(event);
}

text
public static void execute() { execute(null); } private static void execute(@Nullable Event event) { }

}

الإجابة

Итак, нам предоставлен фрагмент кода на Java для мода Minecraft. Пользователь просит изменить рендеринг рук игрока, чтобы они указывали вверх.

Настройка отображения

Задача настроить отображение рук игрока таким образом, чтобы они указывали вверх при правом клике на предмет.

Сейчас я думаю о методом

Я изучаю, как можно изменить рендеринг игрока, отправляя пакет на клиент или используя события рендеринга, чтобы скорректировать углы его рук в Minecraft.

Добавляю качество

Я думаю о подписке на RenderPlayerEvent и корректировке вращений рук игрока. Интересно, как изменение флага или переменной в execute методе может повлиять на это.

Обновляю метод

Корректирую метод execute(), чтобы он приводил обрабатываемое событие к PlayerInteractEvent.RightClickItem и устанавливал флаг для игрока, показывая руку.

Реализую настройку

Использую @SubscribeEvent и сетевые библиотеки, чтобы настроить модель игрока на стороне клиента, изменяя вращение рук перед рендерингом.

Корректирую аннотации

Изменяю аннотации и импортирую net.minecraftforge.api.distmarker.OnlyIn и net.minecraftforge.api.distmarker.Dist для уточнения методов client-сервер.

Согласование данных

Я подмечаю, что проблема с флагом arms_up на стороне клиента заключается в отсутствии автоматической синхронизации persistent data. Необходимо организовать сбалансированную передачу данных, возможно с использованием пакетов или возможностей сущностей.

Понимание проблемы и решение синхронизации отдыхаемых рук.

Проверяю и обновляю

Я смотрю на метод onRightClickItem, чтобы понять, на стороне клиента ли мы, и обновляю флаг arms_up.

Активизация и сброс

Давайте разберемся: устанавливаю флаг при клике, сбрасываю в методе onPlayerRender, проверяю временные интерваллы для точности и корректирую вращение рук.

Прорабатывая детали

Мысленно я представляю, как игроку здорово, указывающему пальцем вверх. Интересно, как магия игры оживляет игрока в течение 10 тиктей после щелчка мышью.

Предлагаю добавить выполнение на клиентской стороне, проверяя event.getEntity().level.isClientSide().

Обновление и анимация

Я смотрю на код, который обновляет состояние рук игрока при клике и устанавливает их на вверх в течение 10 тактов.

الإجابة

java
package net.mcreator.fairytaleelementsbeta.procedures; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.client.event.RenderPlayerEvent; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.Dist; import net.minecraft.world.entity.player.Player; import net.minecraft.client.renderer.entity.PlayerRenderer; import net.minecraft.client.model.PlayerModel; import net.minecraft.client.player.AbstractClientPlayer; import javax.annotation.Nullable; @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE) public class ArmAiProcedure { @SubscribeEvent public static void onRightClickItem(PlayerInteractEvent.RightClickItem event) { if (event.getHand() != event.getEntity().getUsedItemHand()) return; if (event.getEntity().level.isClientSide()) { execute(event); } } public static void execute() { execute(null); } private static void execute(@Nullable Event event) { if (event instanceof PlayerInteractEvent.RightClickItem) { PlayerInteractEvent.RightClickItem evt = (PlayerInteractEvent.RightClickItem) event; Player player = evt.getEntity(); player.getPersistentData().putLong("arms_up_time", player.level.getGameTime()); } } @SubscribeEvent @OnlyIn(Dist.CLIENT) public static void onPlayerRender(RenderPlayerEvent.Pre event) { Player player = event.getEntity(); long armsUpTime = player.getPersistentData().getLong("arms_up_time"); long currentTime = player.level.getGameTime(); if (currentTime - armsUpTime < 10) { // Arms point upwards for 10 ticks PlayerRenderer renderer = event.getRenderer(); PlayerModel<AbstractClientPlayer> model = renderer.getModel(); model.rightArm.xRot = (float) (-Math.PI / 2); // Right arm upwards model.leftArm.xRot = (float) (-Math.PI / 2); // Left arm upwards } } }

Explanation:

  • Event Handling: The onRightClickItem method listens for the player's right-click action.
  • Client-Side Check: We ensure the code runs only on the client side using event.getEntity().level.isClientSide().
  • Persistent Data Storage: When the event is triggered, we store the current game time in the player's persistent data under the key "arms_up_time".
  • Rendering Modification: The onPlayerRender method modifies the player's arm rotation during rendering if the time difference is less than 10 ticks (0.5 seconds).
  • Arm Rotation: We set both model.rightArm.xRot and model.leftArm.xRot to -Math.PI / 2, which rotates the arms to point upwards.

Note: Make sure to import all necessary classes and handle any potential null pointers or exceptions according to your mod's requirements.

مشاركة هذا السؤال والجواب