private void FindEntity(GameObject other, out BasePlayerCharacterEntity player, out BaseMonsterCharacterEntity monster, out NpcEntity npc, out ItemDropEntity itemDrop, out BuildingEntity building, bool findWithAdvanceOptions = true) { player = null; if (findPlayer) { player = other.GetComponent <BasePlayerCharacterEntity>(); if (player == BasePlayerCharacterController.OwningCharacter) { player = null; } if (findWithAdvanceOptions) { if (findOnlyAlivePlayers && player != null && player.IsDead()) { player = null; } if (findPlayerToAttack && player != null && player.IsAlly(BasePlayerCharacterController.OwningCharacter)) { player = null; } } } monster = null; if (findMonster) { monster = other.GetComponent <BaseMonsterCharacterEntity>(); if (findWithAdvanceOptions) { if (findOnlyAliveMonsters && monster != null && monster.IsDead()) { monster = null; } if (findMonsterToAttack && monster != null && monster.IsAlly(BasePlayerCharacterController.OwningCharacter)) { monster = null; } } } npc = null; if (findNpc) { npc = other.GetComponent <NpcEntity>(); } itemDrop = null; if (findItemDrop) { itemDrop = other.GetComponent <ItemDropEntity>(); } building = null; if (findBuilding) { BuildingMaterial buildingMaterial = other.GetComponent <BuildingMaterial>(); if (buildingMaterial != null) { building = buildingMaterial.buildingEntity; } if (findWithAdvanceOptions) { if (findOnlyAliveBuildings && building != null && building.IsDead()) { building = null; } if (findOnlyActivatableBuildings && building != null && !building.Activatable) { building = null; } } } }
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); }