protected virtual void LoadCharacters() { CacheCharacterSelectionManager.Clear(); // Unenabled buttons buttonStart.gameObject.SetActive(false); buttonDelete.gameObject.SetActive(false); // Remove all models characterModelContainer.RemoveChildren(); CharacterModelById.Clear(); // Remove all cached data PlayerCharacterDataById.Clear(); // Show list of created characters List <PlayerCharacterData> selectableCharacters = PlayerCharacterDataExtension.LoadAllPersistentCharacterData(); for (int i = selectableCharacters.Count - 1; i >= 0; --i) { PlayerCharacterData selectableCharacter = selectableCharacters[i]; if (selectableCharacter == null || !GameInstance.PlayerCharacters.ContainsKey(selectableCharacter.DataId)) { selectableCharacters.RemoveAt(i); } } selectableCharacters.Sort(new PlayerCharacterDataLastUpdateComparer().Desc()); CacheCharacterList.Generate(selectableCharacters, (index, characterData, ui) => { // Cache player character to dictionary, we will use it later PlayerCharacterDataById[characterData.Id] = characterData; // Setup UIs UICharacter uiCharacter = ui.GetComponent <UICharacter>(); uiCharacter.Data = characterData; // Select trigger when add first entry so deactivate all models is okay beacause first model will active BaseCharacterModel characterModel = characterData.InstantiateModel(characterModelContainer); if (characterModel != null) { CharacterModelById[characterData.Id] = characterModel; characterModel.gameObject.SetActive(false); characterModel.SetEquipWeapons(characterData.EquipWeapons); characterModel.SetEquipItems(characterData.EquipItems); characterModel.UpdateAnimation(false, MovementState.IsGrounded); CacheCharacterSelectionManager.Add(uiCharacter); } }); }
protected virtual void OnClickCreate() { var gameInstance = GameInstance.Singleton; var selectedUI = SelectionManager.SelectedUI; if (selectedUI == null) { UISceneGlobal.Singleton.ShowMessageDialog("Cannot create character", "Please select character class"); Debug.LogWarning("Cannot create character, did not selected character class"); return; } var characterName = inputCharacterName.text.Trim(); var minCharacterNameLength = gameInstance.minCharacterNameLength; var maxCharacterNameLength = gameInstance.maxCharacterNameLength; if (characterName.Length < minCharacterNameLength) { UISceneGlobal.Singleton.ShowMessageDialog("Cannot create character", "Character name is too short"); Debug.LogWarning("Cannot create character, character name is too short"); return; } if (characterName.Length > maxCharacterNameLength) { UISceneGlobal.Singleton.ShowMessageDialog("Cannot create character", "Character name is too long"); Debug.LogWarning("Cannot create character, character name is too long"); return; } var characterId = GenericUtils.GetUniqueId(); var characterData = new PlayerCharacterData(); characterData.Id = characterId; characterData.SetNewPlayerCharacterData(characterName, selectedUI.Data.DataId, selectedUI.Data.EntityId); characterData.SavePersistentCharacterData(); if (eventOnCreateCharacter != null) { eventOnCreateCharacter.Invoke(); } }
protected virtual void LoadCharacters() { SelectionManager.Clear(); // Show list of characters that can be create var selectableCharacters = GetCreatableCharacters(); CacheList.Generate(selectableCharacters, (index, characterEntity, ui) => { var character = characterEntity.database; var characterData = new PlayerCharacterData(); characterData.DataId = characterEntity.DataId; characterData.EntityId = characterEntity.EntityId; characterData.SetNewPlayerCharacterData(character.title, characterEntity.DataId, characterEntity.EntityId); var uiCharacter = ui.GetComponent <UICharacter>(); uiCharacter.Data = characterData; // Select trigger when add first entry so deactivate all models is okay beacause first model will active var characterModel = characterData.InstantiateModel(characterModelContainer); CharacterModels[characterData.EntityId] = characterModel; characterModel.gameObject.SetActive(false); SelectionManager.Add(uiCharacter); }); }
protected override void Update() { base.Update(); var tempUnscaledTime = Time.unscaledTime; if (tempUnscaledTime - lastSaveTime > autoSaveDuration) { Profiler.BeginSample("LanRpgNetworkManager - Save Data"); var owningCharacter = BasePlayerCharacterController.OwningCharacter; if (owningCharacter != null && IsNetworkActive) { selectedCharacter = owningCharacter.CloneTo(selectedCharacter); owningCharacter.SavePersistentCharacterData(); if (IsServer) { SaveWorld(); } } Profiler.EndSample(); lastSaveTime = tempUnscaledTime; } }
public override void DeserializeClientReadyExtra(LiteNetLibIdentity playerIdentity, long connectionId, NetDataReader reader) { if (LogDev) { Debug.Log("[LanRpgNetworkManager] Deserializing client ready extra"); } PlayerCharacterData playerCharacterData = new PlayerCharacterData().DeserializeCharacterData(reader); BasePlayerCharacterEntity entityPrefab = playerCharacterData.GetEntityPrefab() as BasePlayerCharacterEntity; // If it is not allow this character data, disconnect user if (entityPrefab == null) { Debug.LogError("[LanRpgNetworkManager] Cannot find player character with entity Id: " + playerCharacterData.EntityId); return; } if (!CurrentMapInfo.Id.Equals(playerCharacterData.CurrentMapName)) { playerCharacterData.CurrentPosition = teleportPosition.HasValue ? teleportPosition.Value : CurrentMapInfo.startPosition; } GameObject spawnObj = Instantiate(entityPrefab.gameObject, playerCharacterData.CurrentPosition, Quaternion.identity); BasePlayerCharacterEntity playerCharacterEntity = spawnObj.GetComponent <BasePlayerCharacterEntity>(); playerCharacterData.CloneTo(playerCharacterEntity); Assets.NetworkSpawn(spawnObj, 0, connectionId); // Set user Id playerCharacterEntity.UserId = playerCharacterEntity.Id; // Enable GM commands in Singleplayer / LAN mode // TODO: Don't use fixed user level if (enableGmCommands == EnableGmCommandType.Everyone) { playerCharacterEntity.UserLevel = 1; } // Load world / storage for first character (host) if (playerCharacters.Count == 0) { if (enableGmCommands == EnableGmCommandType.HostOnly) { playerCharacterEntity.UserLevel = 1; } // Load and Spawn buildings worldSaveData.LoadPersistentData(playerCharacterEntity.Id, playerCharacterEntity.CurrentMapName); foreach (BuildingSaveData building in worldSaveData.buildings) { CreateBuildingEntity(building, true); } // Load storage data storageSaveData.LoadPersistentData(playerCharacterEntity.Id); foreach (StorageCharacterItem storageItem in storageSaveData.storageItems) { StorageId storageId = new StorageId(storageItem.storageType, storageItem.storageOwnerId); if (!storageItems.ContainsKey(storageId)) { storageItems[storageId] = new List <CharacterItem>(); } storageItems[storageId].Add(storageItem.characterItem); } // Spawn harvestables HarvestableSpawnArea[] harvestableSpawnAreas = FindObjectsOfType <HarvestableSpawnArea>(); foreach (HarvestableSpawnArea harvestableSpawnArea in harvestableSpawnAreas) { harvestableSpawnArea.SpawnAll(); } } // Summon saved summons for (int i = 0; i < playerCharacterEntity.Summons.Count; ++i) { CharacterSummon summon = playerCharacterEntity.Summons[i]; summon.Summon(playerCharacterEntity, summon.Level, summon.summonRemainsDuration, summon.Exp, summon.CurrentHp, summon.CurrentMp); playerCharacterEntity.Summons[i] = summon; } // Notify clients that this character is spawn or dead if (!playerCharacterEntity.IsDead()) { playerCharacterEntity.RequestOnRespawn(); } else { playerCharacterEntity.RequestOnDead(); } // Register player, will use registered player to send chat / player messages RegisterPlayerCharacter(connectionId, playerCharacterEntity); }