private bool RemoveEntity(GameObject other)
        {
            BasePlayerCharacterEntity  player  = null;
            BaseMonsterCharacterEntity monster = null;
            NpcEntity      npc      = null;
            ItemDropEntity itemDrop = null;
            BuildingEntity building = null;

            FindEntity(other, out player, out monster, out npc, out itemDrop, out building, false);

            if (player != null)
            {
                return(characters.Remove(player) && players.Remove(player));
            }
            if (monster != null)
            {
                return(characters.Remove(monster) && monsters.Remove(monster));
            }
            if (npc != null)
            {
                return(npcs.Remove(npc));
            }
            if (itemDrop != null)
            {
                return(itemDrops.Remove(itemDrop));
            }
            if (building != null)
            {
                return(buildings.Remove(building));
            }
            return(false);
        }
        private bool AddEntity(GameObject other)
        {
            BasePlayerCharacterEntity  player  = null;
            BaseMonsterCharacterEntity monster = null;
            NpcEntity      npc      = null;
            ItemDropEntity itemDrop = null;
            BuildingEntity building = null;

            FindEntity(other, out player, out monster, out npc, out itemDrop, out building);

            if (player != null)
            {
                if (!characters.Contains(player))
                {
                    characters.Add(player);
                }
                if (!players.Contains(player))
                {
                    players.Add(player);
                }
                return(true);
            }
            if (monster != null)
            {
                if (!characters.Contains(monster))
                {
                    characters.Add(monster);
                }
                if (!monsters.Contains(monster))
                {
                    monsters.Add(monster);
                }
                return(true);
            }
            if (npc != null)
            {
                if (!npcs.Contains(npc))
                {
                    npcs.Add(npc);
                }
                return(true);
            }
            if (building != null)
            {
                if (!buildings.Contains(building))
                {
                    buildings.Add(building);
                }
                return(true);
            }
            if (itemDrop != null)
            {
                if (!itemDrops.Contains(itemDrop))
                {
                    itemDrops.Add(itemDrop);
                }
                return(true);
            }
            return(false);
        }
        public override bool IsAlly(BaseCharacterEntity characterEntity)
        {
            if (characterEntity == null)
            {
                return(false);
            }

            if (IsSummoned)
            {
                // If summoned by someone, will have same allies with summoner
                return(characterEntity == Summoner || characterEntity.IsAlly(Summoner));
            }
            if (characterEntity is BaseMonsterCharacterEntity)
            {
                // If another monster has same allyId so it is ally
                BaseMonsterCharacterEntity monsterCharacterEntity = characterEntity as BaseMonsterCharacterEntity;
                if (monsterCharacterEntity != null)
                {
                    if (monsterCharacterEntity.IsSummoned)
                    {
                        return(IsAlly(monsterCharacterEntity.Summoner));
                    }
                    return(monsterCharacterEntity.monsterCharacter.allyId == monsterCharacter.allyId);
                }
            }
            return(false);
        }
예제 #4
0
        public static void AddCharacterEntities(IEnumerable <BaseCharacterEntity> characterEntities)
        {
            if (characterEntities == null)
            {
                return;
            }
            foreach (BaseCharacterEntity characterEntity in characterEntities)
            {
                if (characterEntity == null || AllCharacterEntities.ContainsKey(characterEntity.Identity.HashAssetId))
                {
                    continue;
                }

                AllCharacterEntities[characterEntity.Identity.HashAssetId] = characterEntity;
                if (characterEntity is BasePlayerCharacterEntity)
                {
                    BasePlayerCharacterEntity playerCharacterEntity = characterEntity as BasePlayerCharacterEntity;
                    PlayerCharacterEntities[characterEntity.Identity.HashAssetId] = playerCharacterEntity;
                }
                else if (characterEntity is BaseMonsterCharacterEntity)
                {
                    BaseMonsterCharacterEntity monsterCharacterEntity = characterEntity as BaseMonsterCharacterEntity;
                    MonsterCharacterEntities[characterEntity.Identity.HashAssetId] = monsterCharacterEntity;
                }
            }
        }
예제 #5
0
        IEnumerator SpawnRoutine(float delay)
        {
            yield return(new WaitForSecondsRealtime(delay));

            Vector3    spawnPosition          = GetRandomPosition();
            Quaternion spawnRotation          = GetRandomRotation();
            GameObject spawnObj               = Instantiate(monsterCharacterEntity.gameObject, spawnPosition, spawnRotation);
            BaseMonsterCharacterEntity entity = spawnObj.GetComponent <BaseMonsterCharacterEntity>();

            entity.Level = level;
            entity.SetSpawnArea(this, spawnPosition);
            BaseGameNetworkManager.Singleton.Assets.NetworkSpawn(spawnObj);
        }
예제 #6
0
        /// <summary>
        /// Event that occurs on death. Used primarily to trigger dropping of loot bag.
        /// </summary>
        protected virtual void OnDeath()
        {
            characterDB = this.GetDatabase();
            if (characterDB == null)
            {
                Debug.Log("character DB is null");
                return;
            }

            if (!characterDB.useLootBag)
            {
                return;
            }

            // Determine which loot bag entity to use based on character DB.
            switch (characterDB.lootBagEntity)
            {
            case LootBagEntitySelection.Visible:
                if (GameInstance.Singleton.LootBagEntities.ContainsKey(visibleLootBagName))
                {
                    lootBagEntity = GameInstance.Singleton.LootBagEntities[visibleLootBagName];
                }
                break;

            case LootBagEntitySelection.Invisible:
                if (GameInstance.Singleton.LootBagEntities.ContainsKey(invisibleLootBagName))
                {
                    lootBagEntity = GameInstance.Singleton.LootBagEntities[invisibleLootBagName];
                }
                break;

            case LootBagEntitySelection.Override:
                lootBagEntity = characterDB.lootBagEntityOverride;
                break;
            }

            DropLootBag();

            // If character is a monster, set body destroy delay according to character DB settings.
            BaseMonsterCharacterEntity bmce = this as BaseMonsterCharacterEntity;

            if (bmce != null && characterDB is MonsterCharacter)
            {
                var monsterDB = characterDB as MonsterCharacter;
                if (monsterDB != null && monsterDB.syncDestroyDelayWithBody)
                {
                    bmce.SetDestroyDelay(monsterDB.lootBagDestroyDelay);
                }
            }
        }
예제 #7
0
        public virtual void OnKillMonster(BaseMonsterCharacterEntity monsterCharacterEntity)
        {
            if (!IsServer || monsterCharacterEntity == null)
            {
                return;
            }

            for (int i = 0; i < Quests.Count; ++i)
            {
                CharacterQuest quest = Quests[i];
                if (quest.AddKillMonster(monsterCharacterEntity, 1))
                {
                    quests[i] = quest;
                }
            }
        }
        protected override BaseMonsterCharacterEntity SpawnInternal(BaseMonsterCharacterEntity prefab, short level)
        {
            if (characterObjectIds.Count <= 0)
            {
                // Spawn monster when there are player characters inside this collider
                return(null);
            }
            BaseMonsterCharacterEntity spawnedMonster = base.SpawnInternal(prefab, level);

            if (spawnedMonster != null)
            {
                monsterEntities.Add(spawnedMonster);
                return(spawnedMonster);
            }
            return(null);
        }
예제 #9
0
        public override bool IsAlly(BaseCharacterEntity characterEntity)
        {
            if (characterEntity == null)
            {
                return(false);
            }

            if (characterEntity is BasePlayerCharacterEntity)
            {
                // If this character is in same party or guild with another character so it is ally
                BasePlayerCharacterEntity playerCharacterEntity = characterEntity as BasePlayerCharacterEntity;
                return((PartyId > 0 && PartyId == playerCharacterEntity.PartyId) ||
                       (GuildId > 0 && GuildId == playerCharacterEntity.GuildId));
            }
            if (characterEntity is BaseMonsterCharacterEntity)
            {
                // If this character is summoner so it is ally
                BaseMonsterCharacterEntity monsterCharacterEntity = characterEntity as BaseMonsterCharacterEntity;
                return(monsterCharacterEntity.Summoner != null && monsterCharacterEntity.Summoner == this);
            }
            return(false);
        }
예제 #10
0
        public override bool IsEnemy(BaseCharacterEntity characterEntity)
        {
            if (characterEntity == null)
            {
                return(false);
            }

            if (characterEntity is BasePlayerCharacterEntity)
            {
                // If not ally while this is Pvp map, assume that it is enemy while both characters are not in safe zone
                if (!IsAlly(characterEntity) && gameManager.CurrentMapInfo.canPvp)
                {
                    return(!isInSafeArea && !characterEntity.isInSafeArea);
                }
            }
            if (characterEntity is BaseMonsterCharacterEntity)
            {
                // If this character is not summoner so it is enemy
                BaseMonsterCharacterEntity monsterCharacterEntity = characterEntity as BaseMonsterCharacterEntity;
                return(monsterCharacterEntity.Summoner == null || monsterCharacterEntity.Summoner != this);
            }
            return(false);
        }
        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;
                    }
                }
            }
        }