Динамическая текстура Entity

Версия Minecraft
1.7.10
API
Forge

VeniVidiVici

Санта Барбарис
327
15
198
Нужно сделать у сущности разную текстуру в зависимости от уровня сложности игры, в классе рендера прописываю:
Java:
    public ResourceLocation getEntityTexture(EntityCow entity)
    {
        if(entity.worldObj.difficultySetting == EnumDifficulty.EASY)
            return cowTextureExtra;
        return cowTexture;
    }

    public ResourceLocation getEntityTexture(Entity entity)
    {
        return this.getEntityTexture((EntityCow)entity);
    }

Но текстура обновляется только после перезахода из меню (сменить режим, выйти-зайти). Есть ли возможность как-то решить этот вопрос без перезагрузки? Может можно как-то принудительно обновить карту текстур / ещё что либо?
 
Решение
Если сложность меняется на сервере (командой и тд), то она никак не синхронизируется с клиентом. Синхронизация происходит только при некоторых событиях (ты их написал). Тебе нужно руками слать пакет клиенту с сложностью.
Сделай мапу WeakHashMap<World, EnumDifficulty>, в WorldTickEvent проверяй совпадает ли сложность в мире с значением из мапы. Если нет - шли пакет всем игрокам в мире и записывай в мапу актуальную сложность.

tox1cozZ

aka Agravaine
8,454
598
2,890
Если сложность меняется на сервере (командой и тд), то она никак не синхронизируется с клиентом. Синхронизация происходит только при некоторых событиях (ты их написал). Тебе нужно руками слать пакет клиенту с сложностью.
Сделай мапу WeakHashMap<World, EnumDifficulty>, в WorldTickEvent проверяй совпадает ли сложность в мире с значением из мапы. Если нет - шли пакет всем игрокам в мире и записывай в мапу актуальную сложность.
 

VeniVidiVici

Санта Барбарис
327
15
198
Тебе нужно руками слать пакет клиенту с сложностью.
Сделай мапу WeakHashMap<World, EnumDifficulty>, в WorldTickEvent проверяй совпадает ли сложность в мире с значением из мапы. Если нет - шли пакет всем игрокам в мире и записывай в мапу актуальную сложность.
Я возможно туплю как хлебушек, на то и утро понедельника, но.. это то?

Java:
private WeakHashMap<World, EnumDifficulty> stats;
 
    @SubscribeEvent
    public void difficulty (WorldTickEvent event)
    {
       
if(event.side == Side.SERVER)
        {
            if(stats.isEmpty())
                stats.put(event.world, event.world.difficultySetting);
            else if(event.world.difficultySetting != stats.get(event.world))
            {
                stats.put(event.world, event.world.difficultySetting);
                PacketDispatcher.sendToDimension(new ClientDifficultyUpdate(stats.get(event.world)), 0);
            }
        }
    }
 
Последнее редактирование:

tox1cozZ

aka Agravaine
8,454
598
2,890
Java:
private final WeakHashMap<World, EnumDifficulty> difficulties = new WeakHashMap<>();

    @SubscribeEvent
    public void onWorldTick(WorldTickEvent e){
        if(e.side != Side.SERVER || e.phase != Phase.END){
            return;
        }

        EnumDifficulty prevDifficulty = difficulties.get(e.world);
        if(prevDifficulty != e.world.difficultySetting){
            // Отправляем пакет клиентам в мире

            difficulties.put(e.world, e.world.difficultySetting);
        }
    }
 

VeniVidiVici

Санта Барбарис
327
15
198
Я дико извиняюсь, но у меня не работает. Может я собрал неправильно пакет?

EventHandler, PacketDispatcher и сам пакет инициализированы/зареганы.

Вызов:
PacketDispatcher.sendToDimension(new ClientDifficultyUpdate(e.world.difficultySetting), 0);
Пакет:
public class ClientDifficultyUpdate implements IMessage
{
    private int diff;

    public ClientDifficultyUpdate() {}

    public ClientDifficultyUpdate(EnumDifficulty diff) {
        this.diff = diff.compareTo(diff);
    }
    @Override
    public void fromBytes(ByteBuf buffer) {
        diff = buffer.readInt();
    }

    @Override
    public void toBytes(ByteBuf buffer) {
        buffer.writeInt(diff);
    }
    
    public static class Handler extends AbstractClientMessageHandler<ClientDifficultyUpdate> {
        @Override
        @SideOnly(Side.CLIENT)
        public IMessage handleClientMessage(EntityPlayer player, ClientDifficultyUpdate message, MessageContext ctx) {
            player.worldObj.difficultySetting = EnumDifficulty.getDifficultyEnum(message.diff);
            return null;
        }
    }
}
 
Сверху