IAttribute & DataWatcher/DataManager

IAttribute & DataWatcher/DataManager

1,159
38
544
Если ты не зарегаешь свою переменную в датавотчере, то при ее получении из него тебе эксепшн кинет.
Нефига. У меня на 1.7.10 все работает и без DataWatcher'а:
ExtendedPlayer:
public class ExtendedPlayer implements IExtendedEntityProperties {
    ...
        
    public static final IAttribute WEIGHT_MULTIPLIER = (new RangedAttribute("player.weightMultiplier", 2.5D, 0.0D, Double.MAX_VALUE)).setDescription("Weight Modifier").setShouldWatch(true);
    
    ...
        
    @Override
    public void init(Entity entity, World world) {
        ...
        ((EntityPlayer) entity).getAttributeMap().registerAttribute(WEIGHT_MULTIPLIER);
    }
    
    ...
}

И все! На клиенте все синхронизировано. Может setShouldWatch() регает его в DataWatcher'е?
 

tox1cozZ

aka Agravaine
8,454
598
2,890
Я же тебе объяснил что DataWatcher и атрибуты вообще никак не связаны. Нужно юзать либо то либо другое.
Единственную разницу которую я увидел между ними: DataWatcher шлет все изменение переменных одним пакетом, а атрибуты по одному на пакет.
Ну и естественно атрибутам можно добавлять модификаторы.
 
Последнее редактирование:
1,159
38
544

tox1cozZ

aka Agravaine
8,454
598
2,890
DataWatcher проверяет обновления каждый тик и сразу же отсылает пакет клиенту. Атрибуты же синхронизируются только при обновлении энтити, то есть если он летает, у него обновился датавотчер или по кд:
1577102146181.png
 
1,159
38
544
DataWatcher проверяет обновления каждый тик и сразу же отсылает пакет клиенту. Атрибуты же синхронизируются только при обновлении энтити
А ентити разве не обновляется каждый тик через onUpdate?

если он летает, у него обновился датавотчер или по кд
Сори, не понял что ты сказал. Опиши подробнее плз.
 

tox1cozZ

aka Agravaine
8,454
598
2,890
Обновляться-то обновляется, но синхронизация происходит по кд. Для мобов это 3 тика, для всяких стрел и снежков - 20.
Вопрос: почему это все выглядит и двигается неплохо? Да потому что майн тоже самые движения делает и на клиенте, а сервер по сути просто контролирует актуальность позиций на клиенте.
Открой EntityTrackerEntity и посмотри где вызывается sendMetadataToAllAssociatedPlayers, вроде по коду ясно.
Насколько я понял, датавотчер гарантирует что при изменении значения он сразу же полетит на клиент, а вот в атрибутах такой гарантии нет.
 
1,159
38
544
Для мобов это 3 тика, для всяких стрел и снежков - 20.
Можешь сказать где это прописано? Я у меня под конец дня весь код уже перед глазами плывет.

А за инфу спасибо. Очень информативно.
 

tox1cozZ

aka Agravaine
8,454
598
2,890
Можно, почему нет.
Вот только в пакете тип переменной и айди упаковывают в один байт. Придется писать в шорт, чуточку прибавится в размере пакет, но не думаю что это слишком критично.
 
7,099
324
1,509
Как правильно регать свой DataSerializer?
 
Сверху