public override void LoadData(GameInstance gameInstance)
        {
            // Use Resources Load Async ?
            BaseGameData[]        gameDataList        = Resources.LoadAll <BaseGameData>("");
            BaseCharacterEntity[] characterEntityList = Resources.LoadAll <BaseCharacterEntity>("");

            List <Attribute>                  attributes               = new List <Attribute>();
            List <DamageElement>              damageElements           = new List <DamageElement>();
            List <Item>                       items                    = new List <Item>();
            List <Skill>                      skills                   = new List <Skill>();
            List <NpcDialog>                  npcDialogs               = new List <NpcDialog>();
            List <Quest>                      quests                   = new List <Quest>();
            List <GuildSkill>                 guildSkills              = new List <GuildSkill>();
            List <PlayerCharacter>            playerCharacters         = new List <PlayerCharacter>();
            List <MonsterCharacter>           monsterCharacters        = new List <MonsterCharacter>();
            List <BasePlayerCharacterEntity>  playerCharacterEntities  = new List <BasePlayerCharacterEntity>();
            List <BaseMonsterCharacterEntity> monsterCharacterEntities = new List <BaseMonsterCharacterEntity>();
            List <MapInfo>                    mapInfos                 = new List <MapInfo>();

            // Filtering game data
            foreach (BaseGameData gameData in gameDataList)
            {
                if (gameData is Attribute)
                {
                    attributes.Add(gameData as Attribute);
                }
                if (gameData is DamageElement)
                {
                    damageElements.Add(gameData as DamageElement);
                }
                if (gameData is Item)
                {
                    items.Add(gameData as Item);
                }
                if (gameData is Skill)
                {
                    skills.Add(gameData as Skill);
                }
                if (gameData is NpcDialog)
                {
                    npcDialogs.Add(gameData as NpcDialog);
                }
                if (gameData is Quest)
                {
                    quests.Add(gameData as Quest);
                }
                if (gameData is GuildSkill)
                {
                    guildSkills.Add(gameData as GuildSkill);
                }
                if (gameData is PlayerCharacter)
                {
                    playerCharacters.Add(gameData as PlayerCharacter);
                }
                if (gameData is MonsterCharacter)
                {
                    monsterCharacters.Add(gameData as MonsterCharacter);
                }
                if (gameData is MapInfo)
                {
                    mapInfos.Add(gameData as MapInfo);
                }
            }

            // Filtering character entity
            foreach (BaseCharacterEntity characterEntity in characterEntityList)
            {
                if (characterEntity is BasePlayerCharacterEntity)
                {
                    playerCharacterEntities.Add(characterEntity as BasePlayerCharacterEntity);
                }
                if (characterEntity is BaseMonsterCharacterEntity)
                {
                    monsterCharacterEntities.Add(characterEntity as BaseMonsterCharacterEntity);
                }
            }

            GameInstance.AddAttributes(attributes);
            GameInstance.AddItems(new Item[] { gameInstance.DefaultWeaponItem });
            GameInstance.AddItems(items);
            GameInstance.AddWeaponTypes(new WeaponType[] { gameInstance.DefaultWeaponType });
            GameInstance.AddSkills(skills);
            GameInstance.AddNpcDialogs(npcDialogs);
            GameInstance.AddQuests(quests);
            GameInstance.AddGuildSkills(guildSkills);
            GameInstance.AddCharacters(playerCharacters);
            GameInstance.AddCharacters(monsterCharacters);
            GameInstance.AddCharacterEntities(playerCharacterEntities);
            GameInstance.AddCharacterEntities(monsterCharacterEntities);
            GameInstance.AddMapInfos(mapInfos);
            // Add hit effects
            List <GameEffectCollection> weaponHitEffects = new List <GameEffectCollection>();

            if (gameInstance.DefaultDamageElement.hitEffects != null)
            {
                weaponHitEffects.Add(gameInstance.DefaultDamageElement.hitEffects);
            }
            foreach (DamageElement damageElement in damageElements)
            {
                if (damageElement.hitEffects != null)
                {
                    weaponHitEffects.Add(damageElement.hitEffects);
                }
            }
            GameInstance.AddGameEffectCollections(weaponHitEffects);
            // Tell game instance that data loaded
            gameInstance.LoadedGameData();
        }
Example #2
0
 public abstract void LoadData(GameInstance gameInstance);
        public static ItemDropEntity DropItem(BaseGameEntity dropper, CharacterItem dropData, IEnumerable <uint> looters)
        {
            GameInstance gameInstance = GameInstance.Singleton;

            if (gameInstance.itemDropEntityPrefab == null)
            {
                return(null);
            }

            Vector3    dropPosition = dropper.CacheTransform.position;
            Quaternion dropRotation = Quaternion.identity;

            if (gameInstance.DimensionType == DimensionType.Dimension2D)
            {
                // If 2d, just random position around character
                dropPosition = dropper.CacheTransform.position + new Vector3(Random.Range(-1f, 1f) * gameInstance.dropDistance, Random.Range(-1f, 1f) * gameInstance.dropDistance);
            }
            else
            {
                // Random drop position around character
                dropPosition = dropper.CacheTransform.position + new Vector3(Random.Range(-1f, 1f) * gameInstance.dropDistance, 0, Random.Range(-1f, 1f) * gameInstance.dropDistance);
                // Raycast to find hit floor
                Vector3?   aboveHitPoint    = null;
                Vector3?   underHitPoint    = null;
                int        raycastLayerMask = gameInstance.GetItemDropGroundDetectionLayerMask();
                RaycastHit tempHit;
                if (Physics.Raycast(dropPosition, Vector3.up, out tempHit, GROUND_DETECTION_DISTANCE, raycastLayerMask))
                {
                    aboveHitPoint = tempHit.point;
                }
                if (Physics.Raycast(dropPosition, Vector3.down, out tempHit, GROUND_DETECTION_DISTANCE, raycastLayerMask))
                {
                    underHitPoint = tempHit.point;
                }
                // Set drop position to nearest hit point
                if (aboveHitPoint.HasValue && underHitPoint.HasValue)
                {
                    if (Vector3.Distance(dropPosition, aboveHitPoint.Value) < Vector3.Distance(dropPosition, underHitPoint.Value))
                    {
                        dropPosition = aboveHitPoint.Value;
                    }
                    else
                    {
                        dropPosition = underHitPoint.Value;
                    }
                }
                else if (aboveHitPoint.HasValue)
                {
                    dropPosition = aboveHitPoint.Value;
                }
                else if (underHitPoint.HasValue)
                {
                    dropPosition = underHitPoint.Value;
                }
                // Random rotation
                dropRotation = Quaternion.Euler(Vector3.up * Random.Range(0, 360));
            }
            GameObject     spawnObj       = Instantiate(gameInstance.itemDropEntityPrefab.gameObject, dropPosition, dropRotation);
            ItemDropEntity itemDropEntity = spawnObj.GetComponent <ItemDropEntity>();

            itemDropEntity.dropData = dropData;
            itemDropEntity.looters  = new HashSet <uint>(looters);
            BaseGameNetworkManager.Singleton.Assets.NetworkSpawn(spawnObj);
            return(itemDropEntity);
        }