コード例 #1
0
        protected override void WarpCharacter(BasePlayerCharacterEntity playerCharacterEntity, string mapName, Vector3 position)
        {
            if (!CanWarpCharacter(playerCharacterEntity))
            {
                return;
            }
            base.WarpCharacter(playerCharacterEntity, mapName, position);
            long    connectionId = playerCharacterEntity.ConnectionId;
            MapInfo mapInfo;

            if (!string.IsNullOrEmpty(mapName) &&
                !mapName.Equals(playerCharacterEntity.CurrentMapName) &&
                playerCharacters.ContainsKey(connectionId) &&
                playerCharacterEntity.IsServer &&
                playerCharacterEntity.IsOwnerClient &&
                GameInstance.MapInfos.TryGetValue(mapName, out mapInfo) &&
                mapInfo.IsSceneSet())
            {
                // Save data before warp
                SaveWorld();
                SaveStorage();
                buildingEntities.Clear();
                storageItems.Clear();
                SetMapInfo(mapInfo);
                teleportPosition = position;
                BasePlayerCharacterEntity owningCharacter = BasePlayerCharacterController.OwningCharacter;
                if (owningCharacter != null)
                {
                    selectedCharacter = owningCharacter.CloneTo(selectedCharacter);
                    selectedCharacter.CurrentMapName  = mapInfo.GetSceneName();
                    selectedCharacter.CurrentPosition = position;
                    selectedCharacter.SavePersistentCharacterData();
                }
                // Unregister all players characters to register later after map changed
                foreach (LiteNetLibPlayer player in GetPlayers())
                {
                    UnregisterPlayerCharacter(player.ConnectionId);
                }
                if (owningCharacter != null)
                {
                    // Destroy owning character to avoid save while warp
                    owningCharacter.NetworkDestroy();
                }
                ServerSceneChange(mapInfo.scene);
            }
        }