Esempio n. 1
0
        public void AddPlayers(List <ServerPlayerModel> newlyJoinedServerPlayerModels)
        {
            Log.Info("Adding " + newlyJoinedServerPlayerModels.Count + " players to zone " + ZoneModel.ID);
            for (int i = 0; i < newlyJoinedServerPlayerModels.Count; i++)
            {
                AllPlayersinZone.Add(newlyJoinedServerPlayerModels[i]);
                clientConnectionToServerPlayerModel.Add(newlyJoinedServerPlayerModels[i].ClientConnection, newlyJoinedServerPlayerModels[i]);
                newlyJoinedServerPlayerModels[i].Disconnected += onPlayerDisconnected;
            }

            if (!combatController.IsRunning)
            {
                // If the zone hasn't started yet, immediately send ZoneStarted events.
                SendZoneStartedEventsSCMD.Execute(
                    newlyJoinedServerPlayerModels, ZoneModel, combatController.TurnDispatcher.TurnNumber);
            }
            else
            {
                // Otherwise wait until combatController has completed its current turn.  This will ensure that
                // the combatantModels sent with the event are up to date.
                Action sendZoneStartedOnPostUpdateAction = null;
                sendZoneStartedOnPostUpdateAction = () =>
                {
                    SendZoneStartedEventsSCMD.Execute(
                        newlyJoinedServerPlayerModels, ZoneModel, combatController.TurnDispatcher.TurnNumber);
                    combatController.TurnDispatcher.PostUpdateStarted -= sendZoneStartedOnPostUpdateAction;
                };
                combatController.TurnDispatcher.PostUpdateStarted += sendZoneStartedOnPostUpdateAction;
            }

            // Inform existing players that the new players have joined the zone
            SendPlayersJoinedZoneSCMD.Execute(newlyJoinedServerPlayerModels, AllPlayersinZone);

            for (int i = 0; i < newlyJoinedServerPlayerModels.Count; i++)
            {
                ServerPlayerModel newPlayer = newlyJoinedServerPlayerModels[i];
                combatController.AddCombatantWithBehaviour(newPlayer.CombatantModel, newPlayer.PlayerCombatBehaviour);

                // Start listening to PlayerCombatActionRequests
                newPlayer.ClientConnection.AddOperationRequestListener(OperationCodes.PLAYER_COMBAT_ACTION, onPlayerCombatAction);
            }

            // If a zone isn't active, start it
            if (!combatController.IsRunning)
            {
                // Add npc CombatantModels to combatController
                currentZoneNPCs = new ServerNpcModel[ZoneModel.EnemyNpcModels.Length];
                for (int n = 0; n < ZoneModel.EnemyNpcModels.Length; n++)
                {
                    ServerNpcModel serverNpcModel = ZoneModel.EnemyNpcModels[n] as ServerNpcModel;
                    currentZoneNPCs[n] = serverNpcModel;
                    combatController.AddCombatantWithBehaviour(serverNpcModel.CombatantModel, serverNpcModel.CombatBehaviour);
                }

                Log.InfoHeader("Starting Zone " + ZoneModel.ID);
                combatController.Start(ZONE_START_DELAY_TURNS);
            }
        }
Esempio n. 2
0
        public static void Execute(ServerNpcModel serverNPCModel)
        {
            if (dropTableCollection == null)
            {
                dropTableCollection = DIContainer.GetInstanceByContextID <DropTableCollection>(InstanceServerApplication.CONTEXT_ID);
            }

            // TODO: determine drop table.  For now just use the first one available.
            foreach (var kvp in dropTableCollection)
            {
                serverNPCModel.DropTableModel = kvp.Value;
                return;
            }
        }
Esempio n. 3
0
        private ZoneModel buildZone(int minNpcLevel, RarityType minNpcRarityType, RarityType maxNpcRarityType, int npcTeamID, int maxNpcs)
        {
            int       numNpcs   = 1;
            ZoneModel zoneModel = new ZoneModel();

            zoneModel.EnemyNpcModels = new ServerNpcModel[numNpcs];

            for (int i = 0; i < numNpcs; i++)
            {
                int zoneBasedLevel = minNpcLevel;

                ServerNpcModel serverNpcModel = buildRandomNPC(zoneBasedLevel, npcTeamID, minNpcRarityType, maxNpcRarityType);
                zoneModel.EnemyNpcModels[i] = serverNpcModel;
            }

            return(zoneModel);
        }
Esempio n. 4
0
        private ZoneModel buildZone(int minNpcLevel, RarityType minNpcRarityType, RarityType maxNpcRarityType, int npcTeamID, int maxNpcs)
        {
            int       numNpcs   = RandomGen.GetIntRange(1, maxNpcs);
            ZoneModel zoneModel = new ZoneModel();

            zoneModel.EnemyNpcModels = new ServerNpcModel[numNpcs];

            for (int i = 0; i < numNpcs; i++)
            {
                // Increase npc level by 1 per zone progression
                int zoneBasedLevel = minNpcLevel + i;

                ServerNpcModel serverNpcModel = buildRandomNPC(zoneBasedLevel, npcTeamID, minNpcRarityType, maxNpcRarityType);
                zoneModel.EnemyNpcModels[i] = serverNpcModel;
            }

            return(zoneModel);
        }
Esempio n. 5
0
        private ServerNpcModel buildRandomNPC(int npcLevel, int npcTeamID, RarityType minRarityType, RarityType maxRarityType)
        {
            RarityType npcRarity = RarityConstants.GetRandomRarityRange(minRarityType, maxRarityType);
            NpcRole    npcRole   = (NpcRole)RandomGen.GetIntRange(0, NumNpcRoles - 1);
            NpcRace    npcRace   = (NpcRace)RandomGen.GetIntRange(0, NumNpcRaces - 1);
            NpcSize    npcSize   = (NpcSize)RandomGen.GetIntRange(0, NumNpcSizes - 1);

            // TODO: determine better naming scheme. For now just join Size+Race+Role;
            string npcName = npcSize.ToString() + " " + npcRace.ToString() + " " + npcRole.ToString();

            // Build combatant model
            AbilityItemModel[] randomAbilities = getRandomNPCAbilities((int)npcRarity + 1, npcLevel);
            CombatantModel     combatantModel  = BuildCombatantSCMD.Execute(npcLevel, npcTeamID, randomAbilities, npcRarity);

            // TODO: determine behaviour based on role. For now use default
            CombatBehaviourBase combatBehaviour = new AbilityCycleBehaviour();

            ServerNpcModel serverNpcModel = new ServerNpcModel(combatBehaviour, "", npcName, npcRole, npcRace, npcSize, npcRarity, combatantModel);

            DetermineNPCDropTableSCMD.Execute(serverNpcModel);
            return(serverNpcModel);
        }