Вопрос Shield Statuses с 1.21.4 на 1.21.5

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
3 Сен 2023
Сообщения
343
Реакции
5
просто хотел перенести на версию повыше, все сделал но есть трабл что цвет банально не меняется
package ru.yz1kk.manager;

import net.minecraft.client.MinecraftClient;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.text.Text;

import java.util.concurrent.CopyOnWriteArrayList;

public class ShieldDataManager {
public static ShieldDataManager INSTANCE = new ShieldDataManager();
public final CopyOnWriteArrayList<PlayerStats> disabledShields = new CopyOnWriteArrayList<>();
public void handlePlayerByteStatusEvent(byte status, Object castedClass) {
if (LivingEntity.class.cast(castedClass) instanceof PlayerEntity player && status == 30) {
//MinecraftClient.getInstance().inGameHud.getChatHud().addMessage(Text.of("Handled status " + status));//disable status
disabledShields.add(new PlayerStats(player));
}
}

public void tick() {
disabledShields.forEach(playerStats -> {
playerStats.ticks++;
if (playerStats.ticks >= 100) {
disabledShields.remove(playerStats);
}
});
}


public static class PlayerStats {
public PlayerEntity player;
public int ticks;

public PlayerStats(PlayerEntity player) {
this.player = player;
this.ticks = 0;
}
}
}
типа status = 30 это когда щит сломан, но почему то цвет щита не меняется, как по другому проверить поломку щита? это фулл оригинальный код и почему это не работает я незнаю, может кто шарит и сможет подсказать как сделать иную проверку на сбивание щита
 
просто хотел перенести на версию повыше, все сделал но есть трабл что цвет банально не меняется
package ru.yz1kk.manager;

import net.minecraft.client.MinecraftClient;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.text.Text;

import java.util.concurrent.CopyOnWriteArrayList;

public class ShieldDataManager {
public static ShieldDataManager INSTANCE = new ShieldDataManager();
public final CopyOnWriteArrayList<PlayerStats> disabledShields = new CopyOnWriteArrayList<>();
public void handlePlayerByteStatusEvent(byte status, Object castedClass) {
if (LivingEntity.class.cast(castedClass) instanceof PlayerEntity player && status == 30) {
//MinecraftClient.getInstance().inGameHud.getChatHud().addMessage(Text.of("Handled status " + status));//disable status
disabledShields.add(new PlayerStats(player));
}
}

public void tick() {
disabledShields.forEach(playerStats -> {
playerStats.ticks++;
if (playerStats.ticks >= 100) {
disabledShields.remove(playerStats);
}
});
}


public static class PlayerStats {
public PlayerEntity player;
public int ticks;

public PlayerStats(PlayerEntity player) {
this.player = player;
this.ticks = 0;
}
}
}
типа status = 30 это когда щит сломан, но почему то цвет щита не меняется, как по другому проверить поломку щита? это фулл оригинальный код и почему это не работает я незнаю, может кто шарит и сможет подсказать как сделать иную проверку на сбивание щита
сделай пакет лог ентити статус пакета и там ищи
 
просто хотел перенести на версию повыше, все сделал но есть трабл что цвет банально не меняется
package ru.yz1kk.manager;

import net.minecraft.client.MinecraftClient;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.text.Text;

import java.util.concurrent.CopyOnWriteArrayList;

public class ShieldDataManager {
public static ShieldDataManager INSTANCE = new ShieldDataManager();
public final CopyOnWriteArrayList<PlayerStats> disabledShields = new CopyOnWriteArrayList<>();
public void handlePlayerByteStatusEvent(byte status, Object castedClass) {
if (LivingEntity.class.cast(castedClass) instanceof PlayerEntity player && status == 30) {
//MinecraftClient.getInstance().inGameHud.getChatHud().addMessage(Text.of("Handled status " + status));//disable status
disabledShields.add(new PlayerStats(player));
}
}

public void tick() {
disabledShields.forEach(playerStats -> {
playerStats.ticks++;
if (playerStats.ticks >= 100) {
disabledShields.remove(playerStats);
}
});
}


public static class PlayerStats {
public PlayerEntity player;
public int ticks;

public PlayerStats(PlayerEntity player) {
this.player = player;
this.ticks = 0;
}
}
}
типа status = 30 это когда щит сломан, но почему то цвет щита не меняется, как по другому проверить поломку щита? это фулл оригинальный код и почему это не работает я незнаю, может кто шарит и сможет подсказать как сделать иную проверку на сбивание щита
Смотри, в новых версиях майна статус 30 уже не всегда означает слом щита. Вот что можно попробовать:

Вместо проверки статуса, лучше отслеживай само использование щита. Когда игрок блокирует - смотри на прочность его щита. Если щит почти сломан или сломался после удара - вот тут и добавляй в список.

Код можно переделать примерно так:

java
public void onItemDamage(PlayerEntity player, ItemStack stack) {
if (stack.getItem() instanceof ShieldItem && stack.getDamage() >= stack.getMaxDamage()) {
if (!disabledShields.stream().anyMatch(stats -> stats.player == player)) {
disabledShields.add(new PlayerStats(player));
}
}
}
Или проверяй в тикере:

java
public void tick() {
for (PlayerEntity player : MinecraftClient.getInstance().world.getPlayers()) {
if (player.isUsingItem()) {
ItemStack activeItem = player.getActiveItem();
if (activeItem.getItem() instanceof ShieldItem && activeItem.getDamage() >= activeItem.getMaxDamage()) {
}
}
}
}
 
Назад
Сверху Снизу