/*internal static bool RemovePlayerFromTeam(Team.Member player) * { * foreach (string id in Teams.Keys) * { * RemovePlayerFromTeam(player, id); * } * return true; * }*/ internal static void RemovePlayerAfterDisconnect(string pId, string teamId) { if (Teams[teamId] == null) { return; } int entityId = 0; Team.Member toRemove = null; foreach (Team.Member member in Teams[teamId].members) { if (member.pId == pId) { entityId = member.entityId; toRemove = member; break; } } if (toRemove == null) { return; } Teams[teamId].RemoveMember(toRemove); foreach (Team.Member member in Teams[teamId].members) { member.ClientInfo().SendPackage(NetPackageManager.GetPackage <NetPackagePartyData>().Setup(member.EntityPlayer().Party, entityId, NetPackagePartyData.PartyActions.Disconnected, member.EntityPlayer().Party.MemberList.Count == 0)); } }
internal static bool AddTeam(string id, List <ClientInfo> playersToAdd = null) { if (Teams.ContainsKey(id)) { return(false); } Teams.Add(id, new Team(id)); if (playersToAdd == null) { return(true); } foreach (ClientInfo player in playersToAdd) { Team.Member member = new Team.Member { entityId = player.entityId, nick = player.playerName, pId = player.playerId }; AddPlayerToTeam(member, id); } return(true); }
internal static void PlayerSpawnedInWorld(ClientInfo player, RespawnType respawnReason, Vector3i _pos) { string pId = player.playerId; ModState playerState = VariableContainer.GetPlayerState(pId); World world = GameManager.Instance.World; if (respawnReason.Equals(RespawnType.Died)) { if (playerState.Equals(ModState.RECONNECTING_TO_GAME) || playerState.Equals(ModState.IN_GAME) || playerState.Equals(ModState.START_GAME)) { if (playerState.Equals(ModState.RECONNECTING_TO_GAME)) { Team.Member member = new Team.Member { entityId = player.entityId, nick = player.playerName, pId = pId }; VariableContainer.SetPlayerState(pId, ModState.IN_GAME); TeamMaker.AddPlayerToTeam(member, VariableContainer.GetPlayerLastTeam(pId)); } // Has no items, teleport to team spawn and give items Map map = VariableContainer.GetMap(VariableContainer.selectedMap); Vector3 spawn = TeamMaker.GetPlayerTeam(pId).spawn; Log.Out(string.Format("Spawn for {0} is {1}", player.playerName, spawn.ToString())); // Find random spor around spawn Vector3 destination = Vector3.zero; //if (!world.GetRandomSpawnPositionMinMaxToPosition(spawn, 0, 2, 2, false, out destination, true)) // { destination = spawn; //} player.SendPackage(NetPackageManager.GetPackage <NetPackageTeleportPlayer>().Setup(destination, null, false)); // ReGen // Rebuild terrain around spawn if (!refubrishedCords.Contains(spawn)) { // But only once refubrishedCords.Add(spawn); PrefabInstance prefab = GameManager.Instance.World.GetPOIAtPosition(spawn); int num = World.toChunkXZ((int)spawn.x) - 1; int num2 = World.toChunkXZ((int)spawn.z) - 1; int num3 = num + 2; int num4 = num2 + 2; HashSetLong hashSetLong = new HashSetLong(); for (int k = num; k <= num3; k++) { for (int l2 = num2; l2 <= num4; l2++) { hashSetLong.Add(WorldChunkCache.MakeChunkKey(k, l2)); } } ChunkCluster chunkCache = world.ChunkCache; ChunkProviderGenerateWorld chunkProviderGenerateWorld = world.ChunkCache.ChunkProvider as ChunkProviderGenerateWorld; foreach (long key in hashSetLong) { if (!chunkProviderGenerateWorld.GenerateSingleChunk(chunkCache, key, true)) { ChatManager.Message(player, string.Format("[FF4136]Failed regenerating chunk at position [FF851B]{0}[FF4136]/[FF851B]{1}", WorldChunkCache.extractX(key) << 4, WorldChunkCache.extractZ(key) << 4)); } } world.m_ChunkManager.ResendChunksToClients(hashSetLong); if (prefab != null) { prefab.Reset(world); } } // Give items ClassManager.ApplyClass(player); if (VariableContainer.GetPlayerState(pId).Equals(ModState.START_GAME)) { VariableContainer.SetPlayerState(pId, ModState.IN_GAME); } else { HandleDiedInGame(player); } return; } else { VariableContainer.SetPlayerState(pId, ModState.IN_LOBBY); player.SendPackage(NetPackageManager.GetPackage <NetPackageTeleportPlayer>().Setup(VariableContainer.GetLobbyPosition(), null, false)); return; } } if (respawnReason.Equals(RespawnType.Teleport)) { return; } if (VariableContainer.GetPlayerState(pId).Equals(ModState.RECONNECTING_TO_GAME)) { // Have to kill reconected player Log.Out("Killing bc of reconnect: " + player.playerName); world.Players.dict[player.entityId].DamageEntity(new DamageSource(EnumDamageSource.Internal, EnumDamageTypes.Suicide), 99999, false, 1f); return; } if (VariableContainer.selectedMap == "null") { VariableContainer.SetPlayerState(pId, ModState.IN_LOBBY); player.SendPackage(NetPackageManager.GetPackage <NetPackageTeleportPlayer>().Setup(VariableContainer.GetLobbyPosition(), null, false)); } }
/*intrnal static void MovePlayerToTeam(ClientInfo player, string team) * { * bool b1 = false, b2 = false; * foreach (KeyValuePair<string, HashSet<int>> t in Teams) * { * if (t.Key == team) * { * b1 = AddPlayerToTeam(player, team); * } else * { * b2 = RemovePlayerFromTeam(player, team); * } * * if (b1 && b2) break; * } * }*/ internal static bool AddPlayerToTeam(Team.Member player, string id) { try { if (Teams[id] == null) { return(false); } World world = GameManager.Instance.World; Team team = Teams[id]; EntityPlayer leaderEntity; // Means that this player will be leader if (team.leader.entityId == -1) { Log.Out("[MOD] Making part from " + player.nick); leaderEntity = world.Players.dict[player.entityId]; // Must leave previous party, otherwise bugs will occur if (leaderEntity.IsInParty()) { leaderEntity.LeaveParty(); } leaderEntity.CreateParty(); player.ClientInfo().SendPackage(NetPackageManager.GetPackage <NetPackagePartyData>().Setup(leaderEntity.Party, player.entityId, PartyActions.AutoJoin, false)); Teams[id].AddMember(player); Teams[id].leader = player; return(true); } // We need it to access party leaderEntity = team.leader.EntityPlayer(); // Must leave previous party, otherwise bugs will occur if (player.EntityPlayer().IsInParty()) { player.EntityPlayer().Party.RemovePlayer(player.EntityPlayer()); player.EntityPlayer().LeaveParty(); Log.Out("[MOD] Leaving party " + player.nick); player.ClientInfo().SendPackage(NetPackageManager.GetPackage <NetPackagePartyData>().Setup(player.EntityPlayer().Party, player.entityId, NetPackagePartyData.PartyActions.LeaveParty, true)); } Teams[id].AddMember(player); leaderEntity.Party.AddPlayer(player.EntityPlayer()); foreach (Team.Member member in Teams[id].members) { Log.Out("[MOD] Resend from " + Teams[id].leader.nick + " to " + member.nick); member.ClientInfo().SendPackage(NetPackageManager.GetPackage <NetPackagePartyData>().Setup(leaderEntity.Party, member.entityId, PartyActions.AutoJoin, false)); } return(true); } catch (Exception e) { Log.Error(string.Format("Error in AddPlayerToTeam: {0}", e.Message)); Log.Error(e.StackTrace); Log.Exception(e); return(false); } }