Exemplo n.º 1
0
        public bool InsertMonsterSpawn(MonsterSpawn monsterSpawn)
        {
            int rowsAffected = ExecuteNonQuery(SQL_INSERT_MONSTER_SPAWN, command =>
            {
                AddParameter(command, "@monster_id", monsterSpawn.monsterId);
                AddParameter(command, "@model_id", monsterSpawn.modelId);
                AddParameter(command, "@level", monsterSpawn.level);
                AddParameter(command, "@name", monsterSpawn.name);
                AddParameter(command, "@title", monsterSpawn.title);
                AddParameter(command, "@map_id", monsterSpawn.mapId);
                AddParameter(command, "@x", monsterSpawn.x);
                AddParameter(command, "@y", monsterSpawn.y);
                AddParameter(command, "@z", monsterSpawn.z);
                AddParameter(command, "@active", monsterSpawn.active);
                AddParameter(command, "@heading", monsterSpawn.heading);
                AddParameter(command, "@size", monsterSpawn.size);
                AddParameter(command, "@created", monsterSpawn.created);
                AddParameter(command, "@updated", monsterSpawn.updated);
            }, out long autoIncrement);

            if (rowsAffected <= NO_ROWS_AFFECTED || autoIncrement <= NO_AUTO_INCREMENT)
            {
                return(false);
            }

            monsterSpawn.id = (int)autoIncrement;
            return(true);
        }
        public bool InsertMonsterSpawn(MonsterSpawn monsterSpawn)
        {
            int rowsAffected = ExecuteNonQuery(SqlInsertMonsterSpawn, command =>
            {
                AddParameter(command, "@monster_id", monsterSpawn.MonsterId);
                AddParameter(command, "@model_id", monsterSpawn.ModelId);
                AddParameter(command, "@level", monsterSpawn.Level);
                AddParameter(command, "@name", monsterSpawn.Name);
                AddParameter(command, "@title", monsterSpawn.Title);
                AddParameter(command, "@map_id", monsterSpawn.MapId);
                AddParameter(command, "@x", monsterSpawn.X);
                AddParameter(command, "@y", monsterSpawn.Y);
                AddParameter(command, "@z", monsterSpawn.Z);
                AddParameter(command, "@active", monsterSpawn.Active);
                AddParameter(command, "@heading", monsterSpawn.Heading);
                AddParameter(command, "@size", monsterSpawn.Size);
                AddParameter(command, "@created", monsterSpawn.Created);
                AddParameter(command, "@updated", monsterSpawn.Updated);
            }, out long autoIncrement);

            if (rowsAffected <= NoRowsAffected || autoIncrement <= NoAutoIncrement)
            {
                return(false);
            }

            monsterSpawn.Id = (int)autoIncrement;
            return(true);
        }
 public MonsterTask(NecServer server, MonsterSpawn monster)
 {
     this.monster  = monster;
     this.server   = server;
     monsterFreeze = false;
     monsterActive = true;
     monsterMoving = false;
     _casting      = false;
     _spawnMonster = true;
     monsterHome   = null;
     this.monster.currentCoordIndex = 1;
     _pathingTick     = 100;
     _agroTick        = 200;
     _updateTime      = _pathingTick;
     _agroMoveTime    = 0;
     _agroTickMove    = new MonsterTick();
     _waitTime        = 2000;
     _currentWait     = 0;
     _moveTime        = _updateTime;
     _monsterWaiting  = true;
     agroRange        = 1000;
     _agroCheckTime   = -1;
     _agroDetectAngle = (float)Math.Cos(Math.PI / 1.9);
     _agroMoveAngle   = (float)Math.Cos(Math.PI / 4);
     _castState       = 0;
     _respawnTime     = 10000;
     _currentSkill    = 0;
     _skillInstanceId = 0;
     _map             = this.server.maps.Get(this.monster.mapId);
     _currentDest     = new Vector3();
 }
Exemplo n.º 4
0
 public MonsterTask(NecServer server, MonsterSpawn monster)
 {
     _monster      = monster;
     _server       = server;
     monsterFreeze = false;
     monsterActive = true;
     monsterMoving = false;
     casting       = false;
     spawnMonster  = true;
     monsterHome   = null;
     _monster.CurrentCoordIndex = 1;
     pathingTick     = 100;
     agroTick        = 200;
     updateTime      = pathingTick;
     agroMoveTime    = 0;
     agroTickMove    = new MonsterTick();
     waitTime        = 2000;
     currentWait     = 0;
     moveTime        = updateTime;
     monsterWaiting  = true;
     agroRange       = 1000;
     agroCheckTime   = -1;
     agroDetectAngle = (float)Math.Cos(Math.PI / 1.9);
     agroMoveAngle   = (float)Math.Cos(Math.PI / 4);
     CastState       = 0;
     respawnTime     = 10000;
     currentSkill    = 0;
     skillInstanceId = 0;
     Map             = _server.Maps.Get(_monster.MapId);
     currentDest     = new Vector3();
 }
Exemplo n.º 5
0
        /// <summary>
        ///     Registers the spawns.
        /// </summary>
        /// <param name="spawnSources">The spawn sources.</param>
        public virtual void RegisterSpawns(IEnumerable <SpawnSource> spawnSources)
        {
            foreach (SpawnSource spawnSource in spawnSources)
            {
                foreach (MonsterSpawnSettings monsterSettings in spawnSource.Spawns.OfType <MonsterSpawnSettings>())
                {
                    ITile tile = _tileService.GetTileByPosition(monsterSettings.AbsolutePosition);

                    // TODO: This should throw an exception because it means it's an invalid position
                    if (tile == null)
                    {
                        continue;
                    }

                    MonsterSpawn monsterSpawn = new MonsterSpawn();
                    monsterSpawn.Creature         = monsterSettings.Monster;
                    monsterSpawn.Direction        = Direction.South;
                    monsterSpawn.DrunkCondition   = null;
                    monsterSpawn.ExhaustCondition = null;
                    monsterSpawn.Health           = new Health
                    {
                        Current = monsterSettings.Monster.MaxHealth,
                        Maximum = monsterSettings.Monster.MaxHealth
                    };
                    monsterSpawn.Id          = _creatureSpawnService.TotalCount;
                    monsterSpawn.IsInvisible = false;

                    // TODO: Implement creatures that use existing outfits/mounts
                    monsterSpawn.IsRiding = false;

                    // TODO: Creatures and NPC's don't have a level
                    monsterSpawn.Level = new Level
                    {
                        Current             = 1,
                        Experience          = 1,
                        NextLevelExperience = 0
                    };
                    monsterSpawn.LightInfo              = _lightInfo;
                    monsterSpawn.Monster                = monsterSettings.Monster;
                    monsterSpawn.Mount                  = null;
                    monsterSpawn.Outfit                 = null;
                    monsterSpawn.PoisonCondition        = null;
                    monsterSpawn.RegenerationConditions = null;
                    monsterSpawn.Skull                  = new Skull
                    {
                        Time = TimeSpan.Zero,
                        Type = SkullType.None
                    };
                    monsterSpawn.Speed         = monsterSettings.Monster.BaseSpeed;
                    monsterSpawn.StackPosition = 1;
                    monsterSpawn.Tile          = tile;
                    monsterSpawn.WarIcon       = WarIcon.None;
                    monsterSpawn.Outfit        = monsterSpawn.Monster.Outfit;
                    monsterSpawn.Mount         = monsterSpawn.Monster.Mount;

                    _creatureSpawnService.RegisterCreature(monsterSpawn);
                    _tileService.RegisterCreature(monsterSpawn);
                }
            }
        }
Exemplo n.º 6
0
        public override void Execute(string[] command, NecClient client, ChatMessage message,
                                     List <ChatResponse> responses)
        {
            MonsterSpawn monsterSpawn = Server.Instances.CreateInstance <MonsterSpawn>();

            if (!int.TryParse(command[0], out int monsterId))
            {
                responses.Add(ChatResponse.CommandError(client, $"Invalid Number: {command[0]}"));
                return;
            }

            if (!Server.SettingRepository.Monster.TryGetValue(monsterId, out MonsterSetting monsterSetting))
            {
                responses.Add(ChatResponse.CommandError(client, $"Invalid MonsterId: {monsterId}"));
                return;
            }

            if (!int.TryParse(command[1], out int modelId))
            {
                responses.Add(ChatResponse.CommandError(client, $"Invalid Number: {command[1]}"));
                return;
            }


            if (!Server.SettingRepository.ModelCommon.TryGetValue(modelId, out ModelCommonSetting modelSetting))
            {
                responses.Add(ChatResponse.CommandError(client, $"Invalid ModelId: {modelId}"));
                return;
            }

            Logger.Debug($"modelSetting.Radius [{modelSetting.Radius}]");
            monsterSpawn.MonsterId = monsterSetting.Id;
            monsterSpawn.Name      = monsterSetting.Name;
            monsterSpawn.Title     = monsterSetting.Title;
            monsterSpawn.Level     = (byte)monsterSetting.Level;

            monsterSpawn.ModelId = modelSetting.Id;
            monsterSpawn.Size    = (short)(modelSetting.Height / 2);
            monsterSpawn.Radius  = (short)modelSetting.Radius;

            monsterSpawn.MapId = client.Character.MapId;

            monsterSpawn.X       = client.Character.X;
            monsterSpawn.Y       = client.Character.Y;
            monsterSpawn.Z       = client.Character.Z;
            monsterSpawn.Heading = client.Character.Heading;

            monsterSpawn.Hp.setMax(100);
            monsterSpawn.Hp.setCurrent(100);

            if (!Server.Database.InsertMonsterSpawn(monsterSpawn))
            {
                responses.Add(ChatResponse.CommandError(client, "MonsterSpawn could not be saved to database"));
                return;
            }

            RecvDataNotifyMonsterData monsterData = new RecvDataNotifyMonsterData(monsterSpawn);

            Router.Send(client.Map, monsterData);
        }
Exemplo n.º 7
0
 public void RemoveMonsterSpawn(MonsterSpawn spawn)
 {
     this.m_monsterSpawns.Remove(spawn);
     foreach (SubArea current in this.SubAreas)
     {
         current.RemoveMonsterSpawn(spawn);
     }
 }
Exemplo n.º 8
0
 public void AddMonsterSpawn(MonsterSpawn spawn)
 {
     this.m_monsterSpawns.Add(spawn);
     foreach (Map current in this.Maps)
     {
         current.AddMonsterSpawn(spawn);
     }
 }
Exemplo n.º 9
0
 public void RemoveMonsterSpawn(MonsterSpawn spawn)
 {
     this.m_monsterSpawns.Remove(spawn);
     foreach (Map current in this.Maps)
     {
         current.RemoveMonsterSpawn(spawn);
     }
 }
Exemplo n.º 10
0
 public void AddMonsterSpawn(MonsterSpawn spawn)
 {
     this.m_monsterSpawns.Add(spawn);
     foreach (SubArea current in this.SubAreas)
     {
         current.AddMonsterSpawn(spawn);
     }
 }
Exemplo n.º 11
0
Arquivo: Area.cs Projeto: Mixi59/Stump
        public void RemoveMonsterSpawn(MonsterSpawn spawn)
        {
            m_monsterSpawns.Remove(spawn);

            foreach (var subArea in SubAreas)
            {
                subArea.RemoveMonsterSpawn(spawn);
            }
        }
Exemplo n.º 12
0
        public void AddMonsterSpawn(MonsterSpawn spawn)
        {
            m_monsterSpawns.Add(spawn);

            foreach (var map in Maps.Where(map => map.Outdoor && !map.Record.SpawnDisabled))
            {
                map.AddMonsterSpawn(spawn);
            }
        }
Exemplo n.º 13
0
Arquivo: Area.cs Projeto: Mixi59/Stump
        public void AddMonsterSpawn(MonsterSpawn spawn)
        {
            m_monsterSpawns.Add(spawn);

            foreach (var subArea in SubAreas)
            {
                subArea.AddMonsterSpawn(spawn);
            }
        }
    void SpawnMonsters(int spawn)
    {
        if (PhotonNetwork.isMasterClient)
        {
            // majority will be weaker ones upon initial spawn, but
            // will get stronger spawns as game goes on
            MonsterSpawn monsterSpawn = monsterSpawnList[spawn];
            int          formation    = Random.Range(0, 1000) + (int)Time.time;
            // 1 normal monster
            if (formation < 500)
            {
                GameObject monsterGO = (GameObject)PhotonNetwork.InstantiateSceneObject("Monster", monsterSpawn.transform.position, monsterSpawn.transform.rotation, 0);
                monsterGO.GetComponent <MonsterAI>().enabled = true;
                MonsterAI monster = monsterGO.GetComponent <MonsterAI>();
                monster.setMonsterType("Monster");
                numMonsters++;
            }
            // 2 normal monsters
            else if (formation < 800)
            {
                for (int i = 0; i < 2; i++)
                {
                    GameObject monsterGO = (GameObject)PhotonNetwork.InstantiateSceneObject("Monster", monsterSpawn.transform.position, monsterSpawn.transform.rotation, 0);
                    monsterGO.GetComponent <MonsterAI>().enabled = true;
                    MonsterAI monster = monsterGO.GetComponent <MonsterAI>();
                    monster.setMonsterType("Monster");
                    numMonsters++;
                }
            }
            // 1 normal monster and 1 elite monster
            else if (formation <= 1000)
            {
                GameObject monsterGO = (GameObject)PhotonNetwork.InstantiateSceneObject("Monster", monsterSpawn.transform.position, monsterSpawn.transform.rotation, 0);
                monsterGO.GetComponent <MonsterAI>().enabled = true;
                MonsterAI monster = monsterGO.GetComponent <MonsterAI>();
                monster.setMonsterType("Monster");

                GameObject monsterGO2 = (GameObject)PhotonNetwork.InstantiateSceneObject("MonsterElite", monsterSpawn.transform.position, monsterSpawn.transform.rotation, 0);
                monsterGO2.GetComponent <MonsterAI>().enabled = true;
                MonsterAI monster2 = monsterGO2.GetComponent <MonsterAI>();
                monster2.setMonsterType("MonsterElite");
                numMonsters += 2;
            }
            // 2 elite monsters
            else if (formation > 1000)
            {
                for (int i = 0; i < 2; i++)
                {
                    GameObject monsterGO = (GameObject)PhotonNetwork.InstantiateSceneObject("MonsterElite", monsterSpawn.transform.position, monsterSpawn.transform.rotation, 0);
                    monsterGO.GetComponent <MonsterAI>().enabled = true;
                    MonsterAI monster = monsterGO.GetComponent <MonsterAI>();
                    monster.setMonsterType("MonsterElite");
                    numMonsters++;
                }
            }
        }
    }
Exemplo n.º 15
0
        public void AddMonsterSpawn(MonsterSpawn spawn)
        {
            m_monsterSpawns.Add(spawn);

            foreach (var area in Areas)
            {
                area.AddMonsterSpawn(spawn);
            }
        }
Exemplo n.º 16
0
        public void RemoveMonsterSpawn(MonsterSpawn spawn)
        {
            m_monsterSpawns.Remove(spawn);

            foreach (var map in Maps)
            {
                map.RemoveMonsterSpawn(spawn);
            }
        }
        //To be implemented for monsters
        private void SendBattleReportKnockBack(NecClient client, IInstance instance)
        {
            MonsterSpawn monster = (MonsterSpawn)instance;
            IBuffer      res     = BufferProvider.Provide();

            res.WriteUInt32(monster.instanceId);
            res.WriteFloat(0);
            res.WriteFloat(2); // delay in seconds
            router.Send(client.map, (ushort)AreaPacketId.recv_battle_report_noact_notify_knockback, res,
                        ServerType.Area);
        }
 void SpawnBoss()
 {
     if (PhotonNetwork.isMasterClient)
     {
         // pick a random spawn to spawn at
         int          location  = Random.Range(0, monsterSpawnList.Count);
         MonsterSpawn bossSpawn = monsterSpawnList[location];
         GameObject   monsterGO = (GameObject)PhotonNetwork.InstantiateSceneObject("Boss", bossSpawn.transform.position, bossSpawn.transform.rotation, 0);
         monsterGO.GetComponent <MonsterAI>().enabled = true;
         MonsterAI monster = monsterGO.GetComponent <MonsterAI>();
         monster.setMonsterType("Boss");
     }
 }
Exemplo n.º 19
0
    Monster SpawnMonster(MonsterSpawn monsterSpawn)
    {
        Quaternion rotation   = Quaternion.AngleAxis(Random.Range(0, 360), new Vector3(0, 1, 0));
        GameObject gameObject = (GameObject)Instantiate(monsterSpawn.monster.gameObject, monsterSpawn.transform.position, rotation);
        Rigidbody  rigidbody  = gameObject.GetComponent <Rigidbody>();
        Monster    instance   = gameObject.GetComponent <Monster>();

        instance.OnChop      += OnChopEventHandler;
        instance.OnDeath     += OnDeath;
        instance.OnDeath     += OnDeathEventhandler;
        instance.monsterSpawn = monsterSpawn;
        return(gameObject.GetComponent <Monster>());
    }
        public override void Handle(NecClient client, NecPacket packet)
        {
            ItemService  itemService = new ItemService(client.character);
            int          result      = 0;
            int          instanceId  = packet.data.ReadInt32();
            MonsterSpawn monster     = client.map.GetMonsterByInstanceId((uint)instanceId);

            _Logger.Debug($"{client.character.name} is trying to loot object {instanceId}.  Inventory Space {client.character.itemLocationVerifier.GetTotalFreeSpace(ItemZoneType.AdventureBag)}");
            ItemLocation nextOpenLocation = client.character.itemLocationVerifier.NextOpenSlot(ItemZoneType.AdventureBag);

            if (monster == null)
            {
                result = -10;
            }
            else if (monster.loot.itemCountRng == 0)
            {
                result = -1;
            }
            else if (nextOpenLocation.zoneType == ItemZoneType.InvalidZone)
            {
                result = -207;                                                             //expand to all inventory. TODO
            }
            IBuffer res2 = BufferProvider.Provide();

            res2.WriteInt32(result);
            router.Send(client, (ushort)AreaPacketId.recv_loot_access_object_r, res2, ServerType.Area);
            //LOOT, -1, I don't have anything. , SYSTEM_WARNING,
            //LOOT, -10, no route target, SYSTEM_WARNING,
            //LOOT, -207, There is no space in the inventory. , SYSTEM_WARNING,
            //LOOT, -1500, no root authority. , SYSTEM_WARNING,

            if (result == 0)
            {
                IBuffer res = BufferProvider.Provide();
                res.WriteInt32(2);
                router.Send(client, (ushort)AreaPacketId.recv_situation_start, res, ServerType.Area);

                int             itemId     = monster.loot.dropTableItemSerialIds[monster.loot.itemCountRng];
                ItemSpawnParams spawmParam = new ItemSpawnParams();
                spawmParam.itemStatuses = ItemStatuses.Identified;
                ItemInstance itemInstance = itemService.SpawnItemInstance(ItemZoneType.AdventureBag, itemId, spawmParam);
                _Logger.Debug(itemInstance.type.ToString());
                RecvItemInstance recvItemInstance = new RecvItemInstance(client, itemInstance);
                router.Send(client, recvItemInstance.ToPacket());
                monster.loot.itemCountRng--; //decrement available items

                res = BufferProvider.Provide();
                router.Send(client, (ushort)AreaPacketId.recv_situation_end, res, ServerType.Area);
            }
        }
Exemplo n.º 21
0
        public List <MonsterSpawn> SelectMonsterSpawns()
        {
            List <MonsterSpawn> monsterSpawns = new List <MonsterSpawn>();

            ExecuteReader(SQL_SELECT_MONSTER_SPAWNS, reader =>
            {
                while (reader.Read())
                {
                    MonsterSpawn monsterSpawn = ReadMonsterSpawn(reader);
                    monsterSpawns.Add(monsterSpawn);
                }
            });
            return(monsterSpawns);
        }
        public List <MonsterSpawn> SelectMonsterSpawns()
        {
            List <MonsterSpawn> monsterSpawns = new List <MonsterSpawn>();

            ExecuteReader(SqlSelectMonsterSpawns, reader =>
            {
                while (reader.Read())
                {
                    MonsterSpawn monsterSpawn = ReadMonsterSpawn(reader);
                    monsterSpawns.Add(monsterSpawn);
                }
            });
            return(monsterSpawns);
        }
Exemplo n.º 23
0
        public List <MonsterSpawn> SelectMonsterSpawnsByMapId(int mapId)
        {
            List <MonsterSpawn> monsterSpawns = new List <MonsterSpawn>();

            ExecuteReader(SQL_SELECT_MONSTER_SPAWNS_BY_MAP_ID,
                          command => { AddParameter(command, "@map_id", mapId); },
                          reader =>
            {
                while (reader.Read())
                {
                    MonsterSpawn monsterSpawn = ReadMonsterSpawn(reader);
                    monsterSpawns.Add(monsterSpawn);
                }
            });
            return(monsterSpawns);
        }
Exemplo n.º 24
0
        public void TriggerTrap(Trap trap, MonsterSpawn monster)
        {
            Logger.Debug(
                $"trap._name [{trap._name}] trap.InstanceId [{trap.InstanceId}] trap._skillEffectId [{trap._skillEffectId}] trap._triggerEffectId [{trap._triggerEffectId}]");
            NecClient client = _map.ClientLookup.GetByCharacterInstanceId(ownerInstanceId);

            if (client.Character.IsStealthed())
            {
                uint newState = client.Character.ClearStateBit(0x8);
                RecvCharaNotifyStateflag charState =
                    new RecvCharaNotifyStateflag(client.Character.InstanceId, newState);
                _server.Router.Send(client.Map, charState);
            }

            int damage = Util.GetRandomNumber(70, 90);
            RecvDataNotifyEoData eoTriggerData = new RecvDataNotifyEoData(trap.InstanceId, monster.InstanceId,
                                                                          trap._triggerEffectId, TrapPos, 2, 2);

            _server.Router.Send(_map, eoTriggerData);
            float perHp = (((float)monster.Hp.current / (float)monster.Hp.max) * 100);
            List <PacketResponse>            brList    = new List <PacketResponse>();
            RecvBattleReportStartNotify      brStart   = new RecvBattleReportStartNotify(ownerInstanceId);
            RecvBattleReportEndNotify        brEnd     = new RecvBattleReportEndNotify();
            RecvBattleReportActionAttackExec brAttack  = new RecvBattleReportActionAttackExec(trap._skillId);
            RecvBattleReportNotifyHitEffect  brHit     = new RecvBattleReportNotifyHitEffect(monster.InstanceId);
            RecvBattleReportPhyDamageHp      brPhyHp   = new RecvBattleReportPhyDamageHp(monster.InstanceId, damage);
            RecvObjectHpPerUpdateNotify      oHpUpdate = new RecvObjectHpPerUpdateNotify(monster.InstanceId, perHp);
            RecvBattleReportDamageHp         brHp      = new RecvBattleReportDamageHp(monster.InstanceId, damage);

            brList.Add(brStart);
            //brList.Add(brAttack);
            brList.Add(brHit);
            //brList.Add(brPhyHp);
            brList.Add(brHp);
            brList.Add(oHpUpdate);
            brList.Add(brEnd);
            _server.Router.Send(_map, brList);
            if (monster.GetAgroCharacter(ownerInstanceId))
            {
                monster.UpdateHP(-damage);
            }
            else
            {
                monster.UpdateHP(-damage, _server, true, ownerInstanceId);
            }
        }
Exemplo n.º 25
0
        private void SpawnMonsters()
        {
            MonsterSpawn[] monsterSpawns = Singleton <MonsterManager> .Instance.GetMonsterSpawns();

            for (int i = 0; i < monsterSpawns.Length; i++)
            {
                MonsterSpawn monsterSpawn = monsterSpawns[i];
                if (monsterSpawn.Map != null)
                {
                    if (monsterSpawn.SubArea == null)
                    {
                        monsterSpawn.Map.AddMonsterSpawn(monsterSpawn);
                    }
                    else
                    {
                        if (!Singleton <MonsterManager> .Instance.GetMonsterDisableSpawns(monsterSpawn.MonsterId, monsterSpawn.SubArea.Id))
                        {
                            monsterSpawn.Map.AddMonsterSpawn(monsterSpawn);
                        }
                    }
                }
                else
                {
                    if (monsterSpawn.SubArea != null && !Singleton <MonsterManager> .Instance.GetMonsterDisableSpawns(monsterSpawn.MonsterId, monsterSpawn.SubArea.Id))
                    {
                        monsterSpawn.SubArea.AddMonsterSpawn(monsterSpawn);
                    }
                }
            }
            foreach (MonsterDungeonSpawn current in
                     from spawn in Singleton <MonsterManager> .Instance.GetMonsterDungeonsSpawns()
                     where spawn.Map != null
                     select spawn)
            {
                current.Map.AddMonsterDungeonSpawn(current);
            }
            foreach (System.Collections.Generic.KeyValuePair <int, Map> current2 in
                     from map in this.m_maps
                     where !map.Value.SpawnEnabled && !map.Value.IsDungeonSpawn && map.Value.MonsterSpawnsCount > 0
                     select map)
            {
                current2.Value.EnableClassicalMonsterSpawns();
            }
        }
Exemplo n.º 26
0
    public void ActivateMobSpawn(MonsterSpawn spawn)
    {
        var refCoords = spawn.SpawnData.Coords;

        int min             = Mathf.Max(spawn.SpawnData.MinAmount, 1);
        int numMonsters     = UnityEngine.Random.Range(min, spawn.SpawnData.MaxAmount);
        var monsterToChoose = spawn.SpawnData.Monster;

        if (monsterToChoose == null)
        {
            var candidates = FindMonstersMatchingTagCollection(spawn.SpawnData.SpawnTags);
            if (candidates.Count == 0)
            {
                Debug.Log($"Couldn't find candidate monsters to spawn @ {refCoords}");
                return;
            }

            monsterToChoose = candidates[UnityEngine.Random.Range(0, candidates.Count - 1)];
        }

        Vector2Int[] coordList = new Vector2Int[numMonsters];
        coordList.Fill <Vector2Int>(refCoords);
        if (spawn.SpawnData.Scatter)
        {
            _map.SetRandomCoords(refCoords, ScatterLimitRadius, ref coordList, firstIsRef: false, (coords) =>
            {
                bool matchesTile = monsterToChoose.MovingTraitData.MatchesTile(_map.GetTileAt(coords));
                if (!matchesTile)
                {
                    return(true);
                }

                bool occupied = _entityController.ExistsEntitiesAt(coords);
                return(occupied);
            });
        }
        List <(MonsterData, Vector2Int)> monsterList = new List <(MonsterData, Vector2Int)>();

        for (int i = 0; i < numMonsters; ++i)
        {
            monsterList.Add((monsterToChoose, coordList[i]));
Exemplo n.º 27
0
        public override void ExecuteAdd(TriggerBase trigger)
        {
            var spawn = new MonsterSpawn {
                MonsterId = trigger.Get <MonsterTemplate>("monster").Id
            };


            if (trigger.IsArgumentDefined("map"))
            {
                spawn.Map = trigger.Get <Map>("map") ?? (trigger as GameTrigger).Character.Map;
            }
            else if (trigger.IsArgumentDefined("subarea"))
            {
                spawn.SubArea = trigger.Get <SubArea>("subarea") ?? (trigger as GameTrigger).Character.SubArea;
            }
            else
            {
                throw new Exception("SubArea neither Map is defined");
            }

            spawn.Frequency = trigger.Get <double>("frequency");
            spawn.MinGrade  = trigger.Get <int>("mingrade");
            spawn.MaxGrade  = trigger.Get <int>("maxgrade");

            WorldServer.Instance.IOTaskPool.AddMessage(
                () =>
            {
                MonsterManager.Instance.AddMonsterSpawn(spawn);

                if (spawn.Map != null)
                {
                    spawn.Map.AddMonsterSpawn(spawn);
                }
                else if (spawn.SubArea != null)
                {
                    spawn.SubArea.AddMonsterSpawn(spawn);
                }

                trigger.Reply("Monster spawn {0} added", spawn.Id);
            });
        }
        private MonsterSpawn ReadMonsterSpawn(DbDataReader reader)
        {
            MonsterSpawn monsterSpawn = new MonsterSpawn();

            monsterSpawn.Id        = GetInt32(reader, "id");
            monsterSpawn.ModelId   = GetInt32(reader, "model_id");
            monsterSpawn.MonsterId = GetInt32(reader, "monster_id");
            monsterSpawn.Level     = GetByte(reader, "level");
            monsterSpawn.Name      = GetString(reader, "name");
            monsterSpawn.Title     = GetString(reader, "title");
            monsterSpawn.MapId     = GetInt32(reader, "map_id");
            monsterSpawn.X         = GetFloat(reader, "x");
            monsterSpawn.Y         = GetFloat(reader, "y");
            monsterSpawn.Z         = GetFloat(reader, "z");
            monsterSpawn.Active    = GetBoolean(reader, "active");
            monsterSpawn.Heading   = GetByte(reader, "heading");
            monsterSpawn.Size      = GetInt16(reader, "size");
            monsterSpawn.Created   = GetDateTime(reader, "created");
            monsterSpawn.Updated   = GetDateTime(reader, "updated");
            return(monsterSpawn);
        }
Exemplo n.º 29
0
        private MonsterSpawn ReadMonsterSpawn(DbDataReader reader)
        {
            MonsterSpawn monsterSpawn = new MonsterSpawn();

            monsterSpawn.id        = GetInt32(reader, "id");
            monsterSpawn.modelId   = GetInt32(reader, "model_id");
            monsterSpawn.monsterId = GetInt32(reader, "monster_id");
            monsterSpawn.level     = GetByte(reader, "level");
            monsterSpawn.name      = GetString(reader, "name");
            monsterSpawn.title     = GetString(reader, "title");
            monsterSpawn.mapId     = GetInt32(reader, "map_id");
            monsterSpawn.x         = GetFloat(reader, "x");
            monsterSpawn.y         = GetFloat(reader, "y");
            monsterSpawn.z         = GetFloat(reader, "z");
            monsterSpawn.active    = GetBoolean(reader, "active");
            monsterSpawn.heading   = GetByte(reader, "heading");
            monsterSpawn.size      = GetInt16(reader, "size");
            monsterSpawn.created   = GetDateTime(reader, "created");
            monsterSpawn.updated   = GetDateTime(reader, "updated");
            return(monsterSpawn);
        }
Exemplo n.º 30
0
        public bool UpdateMonsterSpawn(MonsterSpawn monsterSpawn)
        {
            int rowsAffected = ExecuteNonQuery(SQL_UPDATE_MONSTER_SPAWN, command =>
            {
                AddParameter(command, "@monster_id", monsterSpawn.monsterId);
                AddParameter(command, "@model_id", monsterSpawn.modelId);
                AddParameter(command, "@level", monsterSpawn.level);
                AddParameter(command, "@name", monsterSpawn.name);
                AddParameter(command, "@title", monsterSpawn.title);
                AddParameter(command, "@map_id", monsterSpawn.mapId);
                AddParameter(command, "@x", monsterSpawn.x);
                AddParameter(command, "@y", monsterSpawn.y);
                AddParameter(command, "@z", monsterSpawn.z);
                AddParameter(command, "@active", monsterSpawn.active);
                AddParameter(command, "@heading", monsterSpawn.heading);
                AddParameter(command, "@size", monsterSpawn.size);
                AddParameter(command, "@created", monsterSpawn.created);
                AddParameter(command, "@updated", monsterSpawn.updated);
                AddParameter(command, "@id", monsterSpawn.id);
            });

            return(rowsAffected > NO_ROWS_AFFECTED);
        }
Exemplo n.º 31
0
 Monster SpawnMonster(MonsterSpawn monsterSpawn)
 {
     Quaternion rotation = Quaternion.AngleAxis(Random.Range(0, 360), new Vector3(0, 1, 0));
     GameObject gameObject = (GameObject)Instantiate(monsterSpawn.monster.gameObject, monsterSpawn.transform.position, rotation);
     Rigidbody rigidbody = gameObject.GetComponent<Rigidbody>();
     Monster instance = gameObject.GetComponent<Monster>();
     instance.OnChop += OnChopEventHandler;
     instance.OnDeath += OnDeath;
     instance.OnDeath += OnDeathEventhandler;
     instance.monsterSpawn = monsterSpawn;
     return gameObject.GetComponent<Monster>();
 }
Exemplo n.º 32
0
 IEnumerator RespawnMonster(MonsterSpawn monsterSpawn, float time)
 {
     yield return new WaitForSeconds(time);
     SpawnMonster(monsterSpawn);
 }
Exemplo n.º 33
0
        private string GetMonsters(int monsterClass, int spawnClass, DataTable tblMonsters, DataTable tblSpawns)
        {
            string monsters = string.Empty;
            int spawnIndex, monsterIndex;
            List<WaveSpawn> spawns = new List<WaveSpawn>();
            if (monsterClass >= 0)
            {
                //if there's a boss, there are no other spawns
                monsters = GetWikiArticleLink(tblMonsters.Rows[monsterClass]["String_string"].ToString());
            }
            else if (spawnClass >= 0)
            {
                //no boss, get all the spawns

                //assumptions:
                //-base class is always "all" pick type with listed spawns having a count of 1 and equal weight
                //-all spawns have equal weight
                //-spawns don't have subspawns

                List<WaveSpawn> waveSpawns = new List<WaveSpawn>();
                DataRow spawnRow = tblSpawns.Rows[spawnClass];
                DataRow subspawnRow;
                DataRow monsterRow;
                WaveSpawn spawn;
                MonsterSpawn monster;
                StringBuilder builder = new StringBuilder();
                string name, altName;
                string[] nameParts;
                //go through each spawn of the wave
                for (int s = 1; s < 9; s++)
                {
                    spawnIndex = (int)spawnRow["spawn" + s];
                    if (spawnIndex < 0) break;  //nothing else, stop reading

                    subspawnRow = tblSpawns.Rows[spawnIndex];
                    spawn = new WaveSpawn();
                    spawn.Monsters = new List<MonsterSpawn>();
                    spawn.Pick = (SpawnPickType)subspawnRow["pickType"];
                    //go through each individual monster type in the spawn
                    for (int m = 1; m < 9; m++)
                    {
                        monsterIndex = (int)subspawnRow["spawn" + m];
                        if (monsterIndex < 0) break;

                        monsterRow = tblMonsters.Rows[monsterIndex];

                        monster = new MonsterSpawn();
                        monster.Count = int.Parse(subspawnRow["count" + m].ToString().Replace(";", string.Empty));
                        name = monsterRow["String_string"].ToString();
                        //if there's already a monster of the same name, append the other parts of the internal name to differentiate
                        if (spawn.Monsters.Exists(mon => mon.Name == name))
                        {
                            name += " (";
                            altName = monsterRow["name"].ToString();
                            nameParts = altName.Split('_');
                            //should be more than one part, but check anyway
                            if (nameParts.Length > 1)
                            {
                                for (int p = 1; p < nameParts.Length; p++)
                                {
                                    name += nameParts[p] + " ";
                                }
                                name = name.Trim() + ")";
                            }
                        }
                        monster.Name = name;

                        spawn.Monsters.Add(monster);
                    }
                    waveSpawns.Add(spawn);
                }

                //make the list
                builder.AppendLine("<ul>");
                foreach (WaveSpawn wSpawn in waveSpawns)
                {

                    //display "x of:" if not everything will appear
                    if (wSpawn.Pick != SpawnPickType.All && (int)wSpawn.Pick < wSpawn.Monsters.Count)
                    {
                        builder.AppendLine("<li>");
                        builder.AppendLine(wSpawn.Pick.ToString() + " of:");
                        builder.AppendLine("<ul>");
                        builder.Append(GetMonsterList(wSpawn.Monsters));
                        builder.AppendLine("</ul>");
                        builder.AppendLine("</li>");
                    }
                    else
                        builder.Append(GetMonsterList(wSpawn.Monsters));
                }
                builder.Append("</ul>");

                monsters = builder.ToString();
            }
            else
            {
                //no spawns
                monsters = "None";
            }

            return monsters;
        }