Перейти к содержанию

SSC

SSC - режим сервера, при котором персонаж игроков сохраняется на сервере.

Узнать, включен ли SSC можно свойством bool PlayerManager.IsSSCEnabled

Персонаж игрока хранится в ICharacterWrapper? NetPlayer.Character

Разберем основные свойства ICharacterWrapper:

// Модель базы данных персонажа.
public CharacterModel Model { get; }

// Означает, что на сервере включен режим SSC и игрок уже может принимать пакеты SSC
public bool SupportsChange { get; }

// Означает, что игроку заблокирована возможность изменять персонажа.
// Только плагины/модули/ядро может изменять персонажа.
public bool IsReadonly { get; set; }

Индексаторы

У ICharacterWrapper есть два индексатора:

Получение слотов по индексу:

NetPlayer player;
ICharacterWrapper wrapper = player.Character!;

NetItem item = wrapper[5] // Получает предмет в 6 слоту (не 5, потому что слот с индексом 0 это первый слот в привычном понимании.)

Получение цвета чего-либо по индексу:

NetPlayer player;
ICharacterWrapper wrapper = player.Character!;

NetColor hairCol = wrapper[PlayerColorType.HairColor];
NetColor skinCol = wrapper[PlayerColorType.SkinColor];

Изменение

Для начала стоит понять типы синхронизаций (SyncType):

public enum SyncType
{
    // синхронизация только с владельцем персонажа
    Local,

    // синхронизация с пропуском владельца персонажа
    Exclude,

    // синхронизация со всеми
    Broadcast
}
NetPlayer player;
ICharacterWrapper wrapper = player.Character!;

// установит игроку 400 здоровья, 500 максимального здоровья
// Broadcast огласит это всем игрокам.
wrapper.SetLife(SyncType.Broadcast, 400, 500);

// изменит только максимальное здоровье
// null-синхронизация не будет никому отправлять пакеты.
wrapper.SetLife(null, null, 500);

// изменит только текущее здоровье
wrapper.SetLife(null, 400, null);

// работает так же как и SetLife, но с маной
wrapper.SetMana(null, 100, null);

// установит в первом слоте инвентария медную кирку
wrapper.SetSlot(SyncType.Broadcast, 0, new NetItem(Terraria.ID.ItemID.CopperPickaxe, 1, 0));

// установит ярко-красный цвет волос игроку
wrapper.SetColor(SyncType.Broadcast, PlayerColorType.HairColor, new NetColor(255, 0, 0));

// установит 50 выполненных квестов игроку
wrapper.SetQuests(SyncType.Broadcast, 50);

Синхронизация

Если вам нужно синхронизировать персонажа без изменений, то к вашим услугам методы ниже:

NetPlayer player;
ICharacterWrapper wrapper = player.Character!;

// синхронизирует первый слот инвентаря
wrapper.SyncSlot(SyncType.Broadcast, 0);

// синхронизирует здоровье
wrapper.SyncLife(SyncType.Broadcast);

// синхронизирует ману
wrapper.SyncMana(SyncType.Broadcast);

// синхронизирует информацию об игроке (4 пакет)
wrapper.SyncPlayerInfo(SyncType.Broadcast);

// синхронизирует квесты
wrapper.SyncAngler(SyncType.Broadcast);