public Player(World world, Session.Client client, PlayerReference pr)
{
World = world;
InternalName = pr.Name;
PlayerReference = pr;
inMissionMap = world.Map.Visibility.HasFlag(MapVisibility.MissionSelector);
// Real player or host-created bot
if (client != null)
{
ClientIndex = client.Index;
Color = client.Color;
if (client.Bot != null)
{
var botInfo = world.Map.Rules.Actors["player"].TraitInfos <IBotInfo>().First(b => b.Type == client.Bot);
var botsOfSameType = world.LobbyInfo.Clients.Where(c => c.Bot == client.Bot).ToArray();
PlayerName = botsOfSameType.Length == 1 ? botInfo.Name : "{0} {1}".F(botInfo.Name, botsOfSameType.IndexOf(client) + 1);
}
else
{
PlayerName = client.Name;
}
BotType = client.Bot;
Faction = ChooseFaction(world, client.Faction, !pr.LockFaction);
DisplayFaction = ChooseDisplayFaction(world, client.Faction);
}
else
{
// Map player
ClientIndex = 0; // Owned by the host (TODO: fix this)
Color = pr.Color;
PlayerName = pr.Name;
NonCombatant = pr.NonCombatant;
Playable = pr.Playable;
Spectating = pr.Spectating;
BotType = pr.Bot;
Faction = ChooseFaction(world, pr.Faction, false);
DisplayFaction = ChooseDisplayFaction(world, pr.Faction);
}
if (!Spectating)
{
PlayerMask = new LongBitSet <PlayerBitMask>(InternalName);
}
var playerActorType = world.Type == WorldType.Editor ? "EditorPlayer" : "Player";
PlayerActor = world.CreateActor(playerActorType, new TypeDictionary {
new OwnerInit(this)
});
Shroud = PlayerActor.Trait <Shroud>();
FrozenActorLayer = PlayerActor.TraitOrDefault <FrozenActorLayer>();
// Enable the bot logic on the host
IsBot = BotType != null;
if (IsBot && Game.IsHost)
{
var logic = PlayerActor.TraitsImplementing <IBot>().FirstOrDefault(b => b.Info.Type == BotType);
if (logic == null)
{
Log.Write("debug", "Invalid bot type: {0}", BotType);
}
else
{
logic.Activate(this);
}
}
stanceColors.Self = ChromeMetrics.Get <Color>("PlayerStanceColorSelf");
stanceColors.Allies = ChromeMetrics.Get <Color>("PlayerStanceColorAllies");
stanceColors.Enemies = ChromeMetrics.Get <Color>("PlayerStanceColorEnemies");
stanceColors.Neutrals = ChromeMetrics.Get <Color>("PlayerStanceColorNeutrals");
unlockRenderPlayer = PlayerActor.TraitsImplementing <IUnlocksRenderPlayer>().ToArray();
}