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); } }
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; } }
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); }
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); }
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); }