/// <summary> /// Start and run the simulation for this system. /// </summary> public void GameThreadRun() { Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; CurrentTime = Utilities.GetTime(); AddTimer(new UpdateMonitoredObjs(this)); AddTimer(new SpawnBackgroundNPCs(this)); bool running = true; while (running) { // Calculate the delta time. double delta = Utilities.GetTime() - CurrentTime; CurrentTime += delta; // Call the reactor to return the next event the process // and run any timer functions. ReactorEvent next_event = Run(CurrentTime, delta); if (next_event is DPGameRunnerRxMsgEvent) { var revent = next_event as DPGameRunnerRxMsgEvent; // Process a message from this player. If the message isn't for this runner because // the runner ownership changes, requeue in the right place. if (revent.player.Runner != this) { Log.AddLog(LogType.FL_MSG, "Warning: requeued rx msg onto changed runner"); revent.player.Runner.AddEvent(revent); } else { revent.player.RxMsgFromClient(revent.msg); } } else if (next_event is DPGameRunnerPlayerUpdateEvent) { var revent = next_event as DPGameRunnerPlayerUpdateEvent; // If the player is assigned to this runner, make sure we've got it in our // owned player list Player.Player player = revent.player; if (revent.runner == this) { if (!Players.ContainsKey(player.FLPlayerID)) { Log.AddLog(LogType.GENERAL, "Player control gained runner={0} flplayerid={1}", system.Nickname, player.FLPlayerID); Players.Add(player.FLPlayerID, player); if (player.Ship.Objid != 0) { AffObjects[player.Ship.Objid] = player.Ship; } Objects[player.Ship.Objid] = player.Ship; player.Runner = this; player.Ship.Runner = this; AddTimer(player.Ship); } } // If the player is not assigned to this runner, make sure it's not in our // owned player list. else { if (Players.ContainsKey(player.FLPlayerID)) { Log.AddLog(LogType.GENERAL, "Player control lost runner={0} flplayerid={1}", system.Nickname, player.FLPlayerID); if (player.Ship.Objid != 0) { AffObjects.Remove(player.Ship.Objid); } Objects.Remove(player.Ship.Objid); DelTimer(player.Ship); Players.Remove(player.FLPlayerID); } } PlayerListItem update; update = !Playerlist.ContainsKey(revent.flplayerid) ? new PlayerListItem() : Playerlist[revent.flplayerid]; update.Player = revent.player; update.FlPlayerID = revent.flplayerid; update.Name = revent.name; update.Rank = revent.rank; update.System = revent.system; update.Group = revent.group; update.GroupInvited = revent.groupInvited; Playerlist[revent.flplayerid] = update; // Notify all owned players of the player list update foreach (Player.Player p in Players.Values) { p.SendPlayerListUpdate(update); } } else if (next_event is DPGameRunnerPlayerDeletedEvent) { var revent = next_event as DPGameRunnerPlayerDeletedEvent; // fixme: might crash if the player leaves if (!Players.ContainsKey(revent.FlPlayerID)) { continue; } var player = Players[revent.FlPlayerID]; Players.Remove(revent.FlPlayerID); if (player.Ship.Objid != 0) { DelSimObject(player.Ship); } if (Playerlist.ContainsKey(revent.FlPlayerID)) { Playerlist.Remove(revent.FlPlayerID); } foreach (PlayerListItem item in Playerlist.Values) { item.Player.SendPlayerListDepart(player); } } else if (next_event is ReactorShutdownEvent) { running = false; } else if (next_event is DPGRAddCash) { var revent = next_event as DPGRAddCash; if (revent.player.Runner != this) { Log.AddLog(LogType.FL_MSG, "Warning: requeued rx msg onto changed runner"); revent.player.Runner.AddEvent(revent); } else { revent.player.Money += revent.cash; revent.player.SendSetMoney(); } } else if (next_event is DPGRSetCash) { var revent = next_event as DPGRSetCash; if (revent.player.Runner != this) { Log.AddLog(LogType.FL_MSG, "Warning: requeued rx msg onto changed runner"); revent.player.Runner.AddEvent(revent); } else { revent.player.Money = revent.cash; revent.player.SendSetMoney(); } } else if (next_event is DPGRBeam) { var revent = next_event as DPGRBeam; if (revent.Player.Runner != this) { Log.AddLog(LogType.FL_MSG, "Warning: requeued rx msg onto changed runner"); revent.Player.Runner.AddEvent(revent); } else { revent.Player.MonitoredObjs.Clear(); revent.Player.Ship.Basedata = revent.TargetBase; revent.Player.Ship.RespawnBasedata = revent.TargetBase; revent.Player.Ship.System = UniverseDB.FindSystem(revent.TargetBase.SystemID); revent.Player.Ship.IsDestroyed = false; revent.Player.SendServerLand(revent.Player.Ship, 0, revent.Player.Ship.Basedata.BaseID); revent.Player.Runner.Server.AddEvent(new DPGameRunnerPlayerUpdateEvent(revent.Player)); } } } }
public override void HandleTimerEvent(double deltaSeconds) { if (runner.system == UniverseDB.FindSystem("li01")) { //TODO: AI debug here for (int i = 0; i < 1; i++) { var npc = new Ship.Ship(runner); npc.AI = new AI.DebugAI(npc); npc.Arch = ArchetypeDB.Find(FLUtility.CreateID("dsy_csv")); if (npc.Arch == null) { return; } npc.Position = new Vector(-30000 + i * 300, i * 100, -25000); //npc.orientation = ; npc.Rank = 20; npc.System = runner.system; npc.Health = 1.0f; npc.faction = UniverseDB.FindFaction("fc_wild"); Loadout loadout = UniverseDB.FindLoadout("fc_j_ge_csv_loadout01"); if (loadout != null) { uint hpid = 34; foreach (ShipItem item in loadout.Items) { var new_item = new ShipItem(); new_item.arch = item.arch; new_item.count = item.count; new_item.health = 1.0f; new_item.hpid = hpid++; new_item.hpname = item.hpname; new_item.mounted = item.mounted; npc.Items.Add(new_item.hpid, new_item); } } npc.InitialiseEquipmentSimulation(); runner.CreateSimObject(npc); } } // int total = 0; // if (runner.players.Count > 0) // { // if (delta_seconds > 1.5) // runner.log.AddLog(LogType.FL_MSG, "bad delta " + delta_seconds); // // wow, this'll really suck if there are lots of NPCs // foreach (Zone z in runner.system.zones) // { // if (z.shape != null && z.density > 0) // { // while (z.interference < z.density) // borrow this // { // Ship npc = new Ship(runner); // npc.position = z.shape.position; // npc.orientation = z.shape.orientation; // npc.rank = 20; // npc.arch = ArchetypeDB.Find(FLUtility.CreateID("dsy_csv")); // npc.system = runner.system; // npc.health = 1.0f; // runner.CreateSimObject(npc); // z.interference++; // total++; // } // } // } // int working_npcs = 0; // foreach (SimObject o in runner.objects.Values) // { // if (o.health > 0) // { // working_npcs++; // foreach (Player player in runner.players.Values) // { // if (player.ship != o) // { // Vector position = player.ship.position; // position.x += rand.Next(100); // position.z += rand.Next(100); // o.SetUpdateObject(position, player.ship.orientation, 1.0f, 0); // } // } // } // } // runner.log.AddLog(LogType.GENERAL, "system={0} npcs={1} objects={2} running={3}", // runner.system.nickname, total, runner.objects.Count, working_npcs)); // } // ExpireAfter(1); }